web-dev-qa-db-fra.com

PowerShell teste une variable qui n'a pas encore été affectée

Je veux tester pour voir si une variable a été affectée à une variable et sinon effectuer une action. Comment y parvenir?

Je l'ai essayé avec le code suivant, mais je reçois l'erreur: l'opérande de droite "-is" doit être un type.

$ ProgramName n'est pas affecté à ce stade.

If ($ProgramName -isnot $null) {
    $ProgramName = $ProgramName + ', ' + $cncPrograms
}
Else {
    If ($cncPrograms -isnot $null) {
    $ProgramName = $cncPrograms 
    }
}
21
resolver101

Toute variable non affectée aura une valeur nulle, pas un type de données nul. Alors, faites ceci:

If ($ProgramName -ne $null)

... qui renverra TRUE si elle a été affectée à une valeur non nulle.

Une vérification encore plus facile à faire est

IF($ProgramName)

Qui vérifiera si c'est $null ou non, bien que la logique soit inversée, vous pouvez donc utiliser

IF(!$ProgramName)

Modifier:

Ruffin soulève un bon point sur strictmode dans les commentaires. Cette méthode fonctionnera également:

Test-Path variable:ProgramName ou Test-Path variable:global:ProgramName si sa portée est explicitement globale, par exemple. Cela renverra $true ou $false selon que la variable existe.

40
JNK

Test-Path variable:\var devrait faire ce que vous voulez, je suppose.

10
David Brabant

Pour s'appuyer sur les réponses (correctes) de JNK et David, consultez cet excellent article de blog de Jeffrey Snover qui vous guide à travers tous les cas d'utilisation des expressions booléennes dans PoweShell. Il conclut sur la façon de tester l'existence d'une variable.

http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx

3
Andy Arismendi

Contrairement aux réponses ci-dessus

Test-Path variable:ProgramName  

Peut-être pas ce que vous recherchez, car il ne teste que l'existence de la variable. Si la variable est définie sur $ null, elle renvoie toujours $ true.

Par conséquent, en mode strict, vous devrez peut-être tester son existence et savoir si elle n'est pas vide.

Set-StrictMode -version Latest
#TODO Add a scope parameter
Function IsEmpty([string]$varname){
   if (Test-path "variable:$varname"){ 
      $val=(gi "variable:$varname").value
      if ($val -is [bool]) {$false}
      else {$val -eq '' -or $val -eq $null} }
   else{ $true }
}

#TEST:
if (test-path variable:foobar){remove-variable foobar} ; IsEmpty foobar
$foobar=$null; IsEmpty foobar
$foobar='';  IsEmpty foobar;
$foobar=$false;  IsEmpty foobar

#Results:
True
True
True
False

Le mode strict enlève en partie le plaisir des scripts ...

2
Jason Thurston