2010-05-04 2 views
7

Est-il possible de tester l'existence d'une variable à portée de script dans PowerShell?Comment tester l'existence d'une variable à portée de script dans PowerShell?

Je me sers de la PowerShell Community Extensions (PSCX) mais j'ai remarqué que si vous importez le module en Set-PSDebug -Strict est, une erreur se produit:

The variable '$SCRIPT:helpCache' cannot be retrieved because it has not been set. 
At C:\Users\...\Modules\Pscx\Modules\GetHelp\Pscx.GetHelp.psm1:5 char:24 

Alors qu'il enquêtait sur la façon dont je pourrais résoudre ce problème, j'ai trouvé morceau de code dans Pscx.GetHelp.psm1:

#requires -version 2.0 

param([string[]]$PreCacheList) 

if ((!$SCRIPT:helpCache) -or $RefreshCache) { 
    $SCRIPT:helpCache = @{} 
} 

C'est assez directe au code; Si le cache n'existe pas ou doit être actualisé, créez un nouveau cache vide. Le problème est que l'appel $SCRIPT:helpCache alors que Set-PSDebug -Strict est en vigueur casse l'erreur car la variable n'a pas encore été définie.

Idéalement, nous pourrions utiliser une cmdlet Test-Variable mais une telle chose n'existe pas! J'ai pensé à regarder dans le fournisseur variable: mais je ne sais pas comment déterminer la portée d'une variable.

Donc ma question est: comment puis-je tester l'existence d'une variable pendant que Set-PSDebug -Strict est en vigueur, sans provoquer d'erreur?

+3

Si vous utilisez PowerShell 2.0, je vous recommande d'utiliser 'Set-StrictMode -version 2.0', car il détectera d'autres problèmes potentiels. –

Répondre

5

Utilisez test-path variable:SCRIPT:helpCache

if (!(test-path variable:script:helpCache)) { 
    $script:helpCache = @{} 
} 

Cela fonctionne pour moi sans problème. vérifié à l'aide de ce code:

@' 
Set-PsDebug -strict 
write-host (test-path variable:script:helpCache) 
$script:helpCache = "this is test" 
write-host (test-path variable:script:helpCache) and value is $script:helpCache 
'@ | set-content stricttest.ps1 

.\stricttest.ps1 
+0

J'ai ajouté un exemple qui fonctionne vraiment pour moi. Si vous avez des problèmes, j'ai besoin de savoir quels sont les problèmes;) – stej

+2

C'est probablement le meilleur moyen. L'astuce avec [h] elpCache est plus rapide (juste un petit peu), mais c'est hacky. En outre, Test-Path est beaucoup mieux quand le nom d'une variable est lui-même une variable, c'est-à-dire variable: script: $ name –

+0

FWIW, en utilisant 'test-path variable:' est l'approche que nous utilisons habituellement dans PSCX. Je vais jeter un coup d'oeil à ce numéro plus tard ce soir. –

1

Vous pouvez utiliser Get-Variable avec le paramètre -Scope. Cette applet de commande (par défaut au moins) ne reviendra pas seulement la valeur de la variable, mais un objet PSVariable et lancera une exception si la variable ne se trouve pas:

Get-Variable foo -Scope script 
+0

@Johannes Merci pour la réponse. C'est l'exception lancée par 'Get-Variable' que j'essaie d'éviter. Je peux le faire avec 'try/catch' de toute évidence, mais j'aimerais savoir s'il y a une façon plus lisible de ne pas gaspiller de texte rouge dans ma fenêtre de sortie. :) –

+0

* Get-Variable -ErrorAction SilentlyContinue * devrait faire l'affaire. Vous pouvez vérifier le résultat de l'appel de commande. N.B. L'erreur est toujours ajoutée à la liste $ Error, malheureusement. –

+0

@Roman Kuzmin L'astuce '-ErrorAction' n'a pas aidé. Honte, parce que cela semble être une bonne solution. –

4

essayer cette astuce:

Get-Variable [h]elpCache -Scope Script 

Il ne devrait pas jeter ou émettre des erreurs, car nous utilisons un caractère générique [h]elpCache. D'un autre côté, ce genre de joker est un nom littéral de facto.

+0

C'est un joli :-) – Joey

+2

Oui, de cette façon est hacky. @stej propose une meilleure solution. Pourtant, l'astuce avec faux joker est utile dans de nombreux cas, par exemple. pour Get-Process (il n'y a pas d'alternative Test-Path pour les processus). –

+0

C'est vraiment un truc dont je me souviendrai. –