2017-05-29 1 views
2

Aujourd'hui (29/05/2017) J'utilise PowerShell 5.0.10586.117 sur Windows 7 Enterprise et exécutez la commande suivante (raccourcies):soustraction DateTime ne fonctionne pas dans PowerShell - affectation par rapport opérateur d'égalité

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

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

Même la différence entre les deux jours est de 39, mon code saute dans la clause if et envoie "test" à l'écran.

Qu'est-ce que je fais mal ici?

Répondre

6

Vous êtes en affectant14 à $TimeDifference. Au lieu de cela vous wan't pour comparer la propriété Days utilisant -le:

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

Pas la meilleure solution de Martin, juste un code shorty

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

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

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.