2017-05-29 11 views
2

今天(2017年5月29日)我使用Windows 7企業版的PowerShell 5.0.10586.117並運行以下(縮短):日期時間減法在PowerShell中不工作 - 分配與平等的運營商

$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子句中跳轉並將「測試」發送給屏幕。

我在這裏做錯了什麼?

回答

6

你是分配14$TimeDifference。相反,你wan't使用-leDays屬性進行比較:馬丁

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

沒有更好的解決方案,只是一個矮個子碼

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

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

補充Martin Brandl's helpful answer

像許多其他語言 - 但與VBScript不同,例如 - PowerShell使用不同的符號作爲作業 運營商(=)與等於運營商(-eq

這種區別允許使用賦值爲表達,這是你在不經意間做的事:

if (($TimeDifference) = 14) ... 

分配14變量$TimeDifference,馬丁解釋說,和,因爲分配是封閉在(...),返回分配的值內部然而,(...)約在$TimeDifference這裏沒有什麼區別)。

因此,if評估的(...)表達式的值爲14,在此布爾上下文中將其解釋爲$True

要了解有關PowerShell運營商的更多信息,請運行Get-Help about_Operators


最後,這裏是你的代碼,不需要中間變量的精簡版,採用了將字符串轉換爲[datetime]實例,並使用[datetime]::nowGet-Date更有效當量(儘管這很少有關係)。

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

注意如何"test"就其本身的聲明暗示將輸出發送到PowerShell的(成功)輸出流,默認情況下打印到控制檯。
Write-Host繞過此流和should generally be avoided