Как проверить наличие переменной сценария в PowerShell? - PullRequest
7 голосов
/ 04 мая 2010

Можно ли проверить наличие переменной сценария в PowerShell?

Я использовал Расширения сообщества PowerShell (PSCX) , но заметил, что если вы импортируете модуль, когда установлен Set-PSDebug -Strict, выдается ошибка:

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

Исследуя, как я могу это исправить, я нашел этот фрагмент кода в Pscx.GetHelp.psm1:

#requires -version 2.0

param([string[]]$PreCacheList)

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

Это довольно простой код; если кеш не существует или нуждается в обновлении, создайте новый пустой кеш. Проблема в том, что вызов $SCRIPT:helpCache, пока Set-PSDebug -Strict в силе, приводит к ошибке, поскольку переменная еще не определена.

В идеале мы могли бы использовать Test-Variable командлет, но такого не существует! Я думал о поиске в variable: провайдере, но не знаю, как определить область действия переменной.

Итак, мой вопрос: как я могу проверить существование переменной, пока Set-PSDebug -Strict в силе, не вызывая ошибку?

Ответы [ 3 ]

5 голосов
/ 04 мая 2010

Использование test-path variable:SCRIPT:helpCache

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

У меня это работает без проблем. Проверено с помощью этого кода:

@'
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
4 голосов
/ 04 мая 2010

Попробуйте этот трюк:

Get-Variable [h]elpCache -Scope Script

Он не должен выдавать или выдавать какие-либо ошибки, потому что мы используем подстановочный знак [h]elpCache. С другой стороны, этот тип группового символа является буквальным именем де-факто.

1 голос
/ 04 мая 2010

Вы можете использовать Get-Variable с параметром -Scope. Этот командлет (по крайней мере по умолчанию) не будет возвращать только значение переменной, но объект PSVariable и вызовет исключение, если переменная не найдена:

Get-Variable foo -Scope script
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...