【问题标题】:DateTime subtraction not working in PowerShell - assignment vs. equality operatorDateTime 减法在 PowerShell 中不起作用 - 赋值与相等运算符
【发布时间】:2021-11-21 10:54:15
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

    标签: powershell syntax operators equality-operator


    【解决方案1】:

    补充 Martin Brandl's helpful answer:

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

    • 赋值运算符 (=)
    • 对比平等 测试运算符 (-eq)

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

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

    分配 14 到变量 $TimeDifference,正如 Martin 解释的那样,并且,因为分配是(必须服务于作为if 的条件)包含在(...) 中,返回 分配的值(inner (...)$TimeDifference 周围没有区别,但是)和那个值被用作if的布尔条件。

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

    注意:

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

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

    • 要测试已经布尔值的变量或表达式,只需按原样使用它们,或者,如有必要,使用@987654341 否定它们@ (!);例如:

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

    最后,这是一个您的代码的简化版本,它不需要中间变量,使用 cast 将字符串转换为 [datetime] 实例并使用 @ 987654345@,更有效的等价于Get-Date(尽管这并不重要)。

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

    注意"test" 作为一个语句本身是如何将输出隐式发送到 PowerShell 的(成功)输出流,默认情况下打印到控制台。
    Write-Host 绕过这个流和should generally be avoided

    【讨论】:

      【解决方案2】:

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

      $dateOfLicense = [DateTime]"2017-04-20"
      $TimeDifferenceDays = ((Get-Date) - $dateOfLicense).Days 
      
      if ($TimeDifferenceDays -lt 14)
      {
          Write-Host "test"
      }
      

      【讨论】:

        【解决方案3】:

        您正在分配 14$TimeDifference。相反,您不想使用 -le 比较 Days 属性:

        if ($TimeDifference.Days -le 14)
        {
            Write-Host "test"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-10
          • 2017-08-12
          相关资源
          最近更新 更多