为了补充 Martin Brandl 的有用答案:
与许多其他语言一样 - 但与 VBScript 不同,例如 - PowerShell使用不同的符号:
- 赋值运算符( )
=
- 与等式测试运算符 (
-eq
)相比。
这种区别允许使用赋值作为表达式,这是您无意中所做的:
if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...
14
$TimeDifference
正如 Martin 解释的那样,赋值给 variable,并且因为赋值(必须作为的条件if
)包含在布尔条件。(...)
(...)
$TimeDifference
if
也就是说,由(...)
评估的表达式if
具有值14
- 一个非零数字 - 因此$true
在此布尔上下文中被解释为,而与 的原始值无关$TimeDifference
。
笔记:
要了解有关PowerShell 运算符的更多信息,请运行Get-Help about_Operators
要了解PowerShell 如何将任意值解释为条件中的布尔值(to-Boolean coercion),请参阅此答案的底部部分。
要测试已经是Booleans的变量或表达式,只需按原样使用它们,或者,如有必要,用-not
( !
) 否定它们;例如:
if ($someBoolean) { # Better than: if ($someBoolean -eq $true)
if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
最后,这是您的代码的简化版本,它不需要中间变量,使用强制转换将字符串转换为[datetime]
实例并使用[datetime]::now
,更有效的等价物Get-Date
(尽管这很少重要)。
if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
"test"
}
请注意,"test"
作为语句本身如何将输出隐式发送到 PowerShell 的(成功)输出流,默认情况下会打印到控制台。
Write-Host
绕过这个流,通常应该避免。