今天(2017-05-29)我在 Windows 7 Enterprise 上使用 PowerShell 5.0.10586.117 并运行以下命令(缩写):
$dateOfLicense = "2017-04-20"
$dateOfToday = '{0:yyyy-MM-dd}' -f (Get-Date)
$TimeDifference = [DateTime]$dateOfToday - [DateTime]$dateOfLicense
if (($TimeDifference) = 14)
{
Write-Host "test"
}
即使两天之间的差异是 39,我的代码也会跳转到 if 子句并将“test”发送到屏幕。
我在这里做错了什么?
您正在分配
14
至$TimeDifference
。相反,您不想使用 Days
来比较 -le
属性:
if ($TimeDifference.Days -le 14)
{
Write-Host "test"
}
补充 Martin Brandl 的有用答案:
与许多其他语言一样 - 但与 VBScript 不同,例如 -PowerShell 使用不同的符号:
=
)
-eq
)。
允许使用赋值作为表达式,这是您无意中所做的:
# !! ALWAYS $true
if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...
将 14
分配给变量
$TimeDifference
,正如 Martin 所解释的,并且,因为赋值包含在 (...)
中 - 必然用作
if
的条件 -计算为指定值(然而,
(...)
周围的inner$TimeDifference
在这里没有区别)和that值用作
if
的条件。
也就是说,由 (...)
求值的
if
表达式具有值
14
- 一个非零 数 - 因此在此布尔上下文中被解释为
$true
,无论
$TimeDifference
的原始值如何 - 在换句话说:你的条件是总是
$true
。
注:
PowerShell 运算符的更多信息,请运行 Get-Help about_Operators
PowerShell 如何将条件语句中的任意值解释为布尔值(布尔值强制转换),请参阅此答案的底部部分。
要测试已经是布尔值的变量或表达式,只需按原样使用它们,或者如有必要,用-not
(
!
) 对它们取反;例如:if ($someBoolean) { # Better than: if ($someBoolean -eq $true)
if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
,它不需要中间变量,使用cast将字符串转换为[datetime]
实例,并使用
[datetime]::now
,它是Get-Date
更高效的等价物(尽管这很少重要)。if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
"test"
}
请注意 "test"
作为语句本身如何隐式将输出发送到 PowerShell 的(成功)输出流,默认情况下打印到控制台。
Write-Host
通常应避免。
$dateOfLicense = [DateTime]"2017-04-20"
$TimeDifferenceDays = ((Get-Date) - $dateOfLicense).Days
if ($TimeDifferenceDays -lt 14)
{
Write-Host "test"
}