2017-05-29 5 views
2

Heute (2017.05.29) Ich verwende Powershell 5.0.10586.117 auf Windows 7 Enterprise und führen Sie den folgenden (verkürzt):Datetime-Subtraktion nicht in Powershell arbeiten - Zuweisung vs. Gleichheitsoperator

$dateOfLicense = "2017-04-20" 
$dateOfToday = '{0:yyyy-MM-dd}' -f (Get-Date) 

$TimeDifference = [DateTime]$dateOfToday - [DateTime]$dateOfLicense 
if (($TimeDifference) = 14) 
{ 
    Write-Host "test" 
} 

Selbst Der Unterschied zwischen beiden Tagen ist 39, mein Code springt in die if-Klausel und sendet "test" an den Bildschirm.

Was mache ich hier falsch?

Antwort

6

Du Zuordnung14 zu $TimeDifference. Stattdessen wan't Sie die Days Eigenschaft mit -le vergleichen:

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

Nicht bessere Lösung von Martin, nur einen shorty Code

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

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

Um ErgänzungMartin Brandl's helpful answer:

Wie viele andere Sprachen - aber anders als VBScript zum Beispiel - PowerShell verwendet verschiedene Symbole für die Zuweisung Operator (=) im Vergleich zur Gleichheit Operator (-eq).

Diese Unterscheidung ermöglicht unter Verwendung von Zuweisungen als Ausdrücke, das ist, was Sie versehentlich tat

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

ordnet14 variable $TimeDifference, wie Martin erklärt, und, weil die Zuordnung eingeschlossen ist in (...), liefert den zugewiesenen Wert (die innere(...) um $TimeDifference machen hier keinen Unterschied).

Deshalb ist der (...) ausgewertet Ausdruck von if hat Wert 14, die als $True in diesem Booleschen Kontext interpretiert wird.

Wenn Sie mehr über die Operatoren von PowerShell erfahren möchten, führen Sie Get-Help about_Operators aus.


Schließlich ist hier eine rationalisiert Version des Codes, die nicht Zwischenvariablen erfordert, verwendet ein werfen den String in eine [datetime] Instanz zu konvertieren und verwendet [datetime]::now, desto effizienter Äquivalent Get-Date (obwohl das selten von Bedeutung sein wird).

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

Beachten Sie, wie "test" als eine Erklärung von selbst implizit Ausgabe an Powershell (Erfolg) Ausgangsstrom sendet, die standardmäßig auf der Konsole ausgibt.
Write-Host umgeht diesen Stream und should generally be avoided.

Verwandte Themen