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

DateTime subtraction not working in PowerShell - assignment vs. equality operator

今天 (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。相反,您不想使用 -le:

来比较 Days 属性
if ($TimeDifference.Days -le 14)
{
    Write-Host "test"
}

不是 Martin 的更好解决方案,只是一个简短的代码

$dateOfLicense = [DateTime]"2017-04-20"
$TimeDifferenceDays = ((Get-Date) - $dateOfLicense).Days 

if ($TimeDifferenceDays -lt 14)
{
    Write-Host "test"
}

补充 :

与许多其他语言一样 - 但与 VBScript 不同,例如 - PowerShell 使用不同的符号:

  • 赋值运算符(=)
  • 对比equality 测试运算符 (-eq).

这种区别 允许将赋值用作 表达式 ,这是您无意中所做的:

if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...

14 赋值给变量 $TimeDifference,正如 Martin 解释的那样,并且 因为赋值是 (必然,作为 if 的条件)包含在 (...)returns 中值(但是,$TimeDifference 周围的 inner (...) 在这里没有区别)和 that 值用作布尔值if.

的条件

也就是说,由 if 评估的 (...) 表达式具有值 14 - 一个 非零 数字 - 因此被解释为 $true 在此布尔上下文中,与 $TimeDifference.

的原始值无关

注:

  • 了解有关 PowerShell 运算符的更多信息、运行 Get-Help about_Operators

  • 要了解 PowerShell 如何将任意值解释为条件 中的布尔值(to-Boolean 强制转换),请参阅 的底部部分。

  • 要测试已经布尔值的变量或表达式,只需将它们用作- is 或者,如有必要,用 -not (!) 否定它们;例如:

    if ($someBoolean) {      # Better than: if ($someBoolean -eq $true)
    if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
    

最后,这里有一个代码的简化版本,不需要中间变量,使用cast将字符串转换为一个 [datetime] 实例并使用 [datetime]::nowGet-Date 的更有效等价物(尽管这很少重要)。

if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
  "test"
}

请注意 "test" 作为语句本身如何隐式地将输出发送到 PowerShell 的(成功)输出流,默认情况下输出到控制台。
Write-Host 绕过此流并 should generally be avoided.