今天(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”发送到屏幕。
我在这里做错了什么?
答案 0 :(得分:6)
您将 14
分配给$TimeDifference
。相反,您不想使用Days
来比较-le
属性:
if ($TimeDifference.Days -le 14)
{
Write-Host "test"
}
答案 1 :(得分:2)
补充 Martin Brandl's helpful answer:
与许多其他语言一样 - 但与VBScript不同,例如 - PowerShell为赋值使用不同的符号
运算符(=
)与相等运算符(-eq
)。
这种区别可以将分配用作表达式 ,这是您无意中所做的:
if (($TimeDifference) = 14) ...
正如马丁解释的那样, 将 14
分配给变量$TimeDifference
,并且因为分配包含在(...)
中,返回< / em>指定值({em>内部 (...)
在$TimeDifference
周围没有任何区别,但是)。
因此,(...)
评估的if
表达式的值为14
,在此布尔上下文中被解释为$True
。
要了解有关PowerShell运营商的更多信息,请运行Get-Help about_Operators
。
最后,这是一个简化的代码版本,不需要中间变量,使用强制转换将字符串转换为[datetime]
实例,使用[datetime]::now
,效率更高的Get-Date
(虽然这很少有问题)。
if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
"test"
}
注意"test"
作为语句本身如何隐式地将输出发送到PowerShell的(成功)输出流,默认情况下会输出到控制台。
Write-Host
绕过此流和should generally be avoided。
答案 2 :(得分:0)
不是马丁的更好解决方案,只是一个简短的代码
$dateOfLicense = [DateTime]"2017-04-20"
$TimeDifferenceDays = ((Get-Date) - $dateOfLicense).Days
if ($TimeDifferenceDays -lt 14)
{
Write-Host "test"
}