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

DateTime减法在PowerShell中不起作用-赋值与相等运算符,powershell,syntax,operators,equality-operator,Powershell,Syntax,Operators,Equality Operator,今天(2017-05-29),我在Windows 7 Enterprise上使用PowerShell 5.0.10586.117并运行以下程序(简称): 即使两天之间的差异是39,我的代码也会跳入if子句并向屏幕发送“test” 我做错了什么?您正在将14分配给$TimeDifference。相反,您不希望使用-le来比较天属性: if ($TimeDifference.Days -le 14) { Write-Host "test" } 不是马丁更好的解决方案,只是一个简短的代码 $

今天(2017-05-29),我在Windows 7 Enterprise上使用PowerShell 5.0.10586.117并运行以下程序(简称):

即使两天之间的差异是39,我的代码也会跳入if子句并向屏幕发送“test”

我做错了什么?

您正在将
14
分配给
$TimeDifference
。相反,您不希望使用
-le
来比较
属性:

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

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

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

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

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

  • 赋值运算符(
    =
  • vs.相等运算符(
    -eq
此区别允许将赋值用作表达式,这是您无意中所做的:

if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...
正如Martin解释的那样,将
14
赋值给变量
$TimeDifference
,并且,因为赋值是(必要时,作为
的条件,如果
包含在
(…)
中,返回赋值(内部
(…)
around
$TimeDifference
在这里没有区别)

因此,由
if
计算的
(…)
表达式具有值
14
-一个非零数-在该布尔上下文中,它被解释为
$true

注:

  • 要了解有关PowerShell运营商的更多信息,请运行

  • 要了解PowerShell如何将条件中的任意值解释为布尔值(对于布尔强制),请参阅的底部部分

  • 要测试已经是布尔值的变量或表达式,只需按原样使用它们,或者在必要时,使用
    -not
    )来否定它们;e、 g:


最后,这里是一个精简版的代码
,它不需要中间变量,使用强制转换将字符串转换为一个
[datetime]
实例,并使用
[datetime]::now
,这是与
获取日期
更有效的等价物(尽管这几乎无关紧要)

请注意,
“test”
作为语句本身是如何隐式地将输出发送到PowerShell的(成功)输出流的,默认情况下,输出流会打印到控制台。
Write Host
绕过此流并将其删除

if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...
if ($someBoolean) {      # Better than: if ($someBoolean -eq $true)
if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
  "test"
}