提问者:小点点

日期时间减法在 PowerShell 中不起作用 - 赋值与相等运算符


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

我在这里做错了什么?


共3个答案

匿名用户

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

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

匿名用户

补充Martin Brandl的有用答案:

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

  • 赋值运算符(=
  • vs。相等测试运算符(-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"
    }