今天(2017-05-29)我在Windows 7企业版上使用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
。相反,您不想使用 -le
比较 Days
属性:
if ($TimeDifference.Days -le 14)
{
Write-Host "test"
}
补充Martin Brandl的有用答案:
与许多其他语言一样——但与VBScript不同,例如——PowerShell使用不同的符号:
=
)-eq
)这种区别允许将赋值用作表达式,这是您无意中做的:
if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...
将14
赋值给变量$TimeDifference
,正如Martin所解释的,并且,由于赋值(必要时,如果)包含在(…)
,则作为的条件,返回赋值值(内部
,则该值用作(…)
在$timedifferent
周围,这里没有区别,但是,如果的布尔条件。
也就是说,由 if
计算的 (...)
表达式具有值 14
(非零数),因此在此布尔上下文中被解释为$true
,而不管$TimeDifference
的原始值如何。
注意:
>
要了解有关PowerShell操作符的更多信息,请运行Get-Helpabout_Operators
若要了解 PowerShell 如何将任意值解释为条件中的布尔值(到布尔强制),请参阅此答案的底部部分。
要测试已经是布尔值的变量或表达式,只需按原样使用它们,或者在必要时使用-not
(!
)否定它们;例如:
if ($someBoolean) { # Better than: if ($someBoolean -eq $true)
if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
最后,这里是您的代码的简化版本,它不需要中间变量,使用强制转换将字符串转换为[datetime]
实例,并使用[datetime]::现在
,更有效的相当于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"
}