2010-05-04 3 views
7

Можно ли проверить наличие переменной Scope в PowerShell?Как проверить наличие переменной Scope в PowerShell?

Я с помощью PowerShell Community Extensions (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

Если вы используете PowerShell 2.0, я бы рекомендовал использовать 'Set-StrictMode -version 2.0', так как он уловит дополнительные потенциальные проблемы. –

ответ

5

Использование 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 
+0

Я добавил пример, который действительно работает для меня. Если у вас есть какие-либо проблемы, мне нужно знать, в чем проблема:) – stej

+2

Это, наверное, лучший способ. Трюк с [h] elpCache быстрее (немного), но он взломан. Кроме того, путь Test-Path намного лучше, когда имя переменной является самой переменной, т. Е. Переменной Test-Path: script: $ name –

+0

FWIW, используя переменную test-path: '- это подход, который мы обычно применяем в PSCX. Я рассмотрю этот вопрос позже сегодня вечером. –

1

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

Get-Variable foo -Scope script 
+0

@Johannes Спасибо за ответ. Это исключение, которое бросает «Get-Variable», которого я пытаюсь избежать, хотя. Я могу сделать это с помощью 'try/catch', но я хотел бы знать, есть ли более читаемый способ, который не разбивает красный текст на мое окно вывода. :) –

+0

* Get-Variable -ErrorAction SilentlyContinue * должен делать трюк. Вы можете проверить результат командного вызова. Нотабене К сожалению, ошибка по-прежнему добавляется в список ошибок $. –

+0

@Roman Kuzmin Трюк '-ErrorAction' не помог. Позор, потому что это похоже на хорошее решение. –

4

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

Get-Variable [h]elpCache -Scope Script 

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

+0

Это аккуратный :-) – Joey

+2

Да, этот способ взломан. @stej предлагает лучшее решение. Тем не менее, трюк с поддельным шаблоном полезен во многих случаях, например. для Get-Process (для процессов нет альтернативы Test-Path). –

+0

Это определенно трюк, который я запомню. –

Смежные вопросы