Pour complémentMartin Brandl's helpful answer:
Comme beaucoup d'autres langues - mais contrairement à VBScript, par exemple - PowerShell utilise des symboles distincts pour l'affectation opérateur (=
) par rapport à l'opérateur égalité (-eq
).
Cette distinction permet d'utiliser les affectations comme expressions, qui est ce que vous avez accidentellement fait:
if (($TimeDifference) = 14) ...
attribue14
à la variable $TimeDifference
, comme Martin explique, et, parce que la mission est jointe dans (...)
, renvoie la valeur affectée (le intérieur(...)
autour de $TimeDifference
ne font aucune différence ici, cependant).
Par conséquent, l'expression (...)
évaluée par if
a une valeur 14
, qui est interprété comme $True
dans ce contexte booléen. Pour plus d'informations sur les opérateurs PowerShell, exécutez Get-Help about_Operators
.
Enfin, voici une version simplifiée de votre code qui ne nécessite pas des variables intermédiaires, utilise un coulé pour convertir la chaîne en une instance [datetime]
et utilise [datetime]::now
, l'équivalent plus efficace des Get-Date
(bien que cela compte rarement).
if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
"test"
}
Notez comment "test"
comme une déclaration par lui-même envoie implicitement la sortie au flux de sortie de PowerShell (succès), qui imprime à la console par défaut.Ignore
Write-Host
contourne ce flux et should generally be avoided.