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

问题描述 投票:0回答:3

今天(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
3个回答
7
投票

您正在分配

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

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

3
投票

补充 Martin Brandl 的有用答案

与许多其他语言一样 - 但与 VBScript 不同,例如 -

PowerShell 使用不同的符号:

  • 赋值运算符 (=
    )
  • 对比
  • 相等测试运算符 (-eq
    )
这种区别

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

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

14

 分配给变量 
$TimeDifference
,正如 Martin 所解释的,并且,因为赋值包含在 
(...)
 中 - 必然用作 
if
 的条件 - 
计算为指定值(然而,(...)周围的inner
 
$TimeDifference
在这里没有区别)和
that值用作if
的条件。

也就是说,由

(...)

 求值的 
if
 表达式具有值 
14
 - 一个 
非零 数 - 因此在此布尔上下文中被解释为 $true
,无论 
$TimeDifference
 的原始值如何 - 在换句话说:
你的条件是总是$true

注:

  • 要了解有关

    PowerShell 运算符的更多信息,请运行 Get-Help about_Operators

    
    

  • 要了解

    PowerShell 如何将条件语句中的任意值解释为布尔值(布尔值强制转换),请参阅此答案的底部部分。

  • 要测试已经布尔值的变量或表达式,只需按原样使用它们,或者如有必要,用-not (

    !
    ) 对它们取反;例如:
    if ($someBoolean) {      # Better than: if ($someBoolean -eq $true)
    if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
    

    
    
最后,这是代码的
精简版本

,它不需要中间变量,使用cast将字符串转换为[datetime]实例,并使用

[datetime]::now
,它是
Get-Date
更高效的等价物(尽管这很少重要)。
if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
  "test"
}

请注意 

"test" 作为语句本身如何隐式将输出发送到 PowerShell 的(成功)输出流,默认情况下打印到控制台。

Write-Host
绕过此流,并且
 通常应避免


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.