DateTime减法在PowerShell中不起作用 - 赋值与等于运算符

时间:2017-05-29 13:16:15

标签: powershell syntax operators

今天(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”发送到屏幕。

我在这里做错了什么?

3 个答案:

答案 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"
}