PowerShell - Как проверить значение переменной с помощью «Set-StrictMode -version latest»? - PullRequest
14 голосов
/ 04 февраля 2009

Я только начал делать некоторые сценарии PowerShell и столкнулся с проблемой тестирования переменных для значения. Я пытаюсь запустить все с включенными предупреждениями, особенно во время обучения, чтобы уловить глупые ошибки. Итак, я использую CTPV3 и устанавливаю строгий режим с помощью "set-strictmode -version latest". Но я сталкиваюсь с дорожным блоком с проверкой входящих переменных для значения. Эти переменные могут быть или не быть уже установлены.

# all FAIL if $var is undefined under "Set-StrictMode -version latest"
if ( !$var ) { $var = "new-value"; } 
if ( $var -eq $null ) { $var = "new-value"; } 

Я не могу найти способ проверить, имеет ли переменная значение, которое не вызывает предупреждений, когда переменная отсутствует, если я не отключу строгий режим. И я не хочу включать и выключать строгий режим везде, чтобы проверить переменные. Я уверен, что забуду включить его где-нибудь, и это выглядит ужасно загроможденным. Это не может быть правдой. Чего мне не хватает?

Ответы [ 2 ]

41 голосов
/ 04 февраля 2009

Вы действительно проверяете две вещи: существование и ценность. И тест на существование является тем, который вызывает предупреждения при работе в строгом режиме. Итак, отдельные тесты. Помните, что PowerShell рассматривает переменные просто как другого поставщика (как поставщика файлов или реестра) и что все переменные PowerShell существуют как файлы в корневой папке диска называется 'variable:', становится очевидным, что вы можете использовать тот же механизм, который вы обычно используете для проверки любого другого файла существования. Следовательно, используйте 'test-path':

if (!(test-path variable:\var)) {$var = $null} # test for EXISTENCE & create
if ( !$var ) { $var = "new-value"; }           # test the VALUE

Обратите внимание, что текущий строгий режим можно изменить в дочерних областях, не затрагивая родительскую область (например, в скриптовых блоках). Таким образом, вы могли бы написать блок сценария, который инкапсулирует удаление строгого режима и установку переменной, не влияя на строгость окружающей программы. Это немного сложно из-за переменной области видимости. Я могу придумать две возможности:

# 1 - вернуть значение из блока скрипта

$var = & { Set-StrictMode -off; switch( $var ) { $null { "new-value" } default { $var } }}

или # 2 - использовать модификаторы области видимости

& { Set-StrictMode -off; if (!$var) { set-variable -scope 1 var "new-value" }}

Вероятно, худшая часть этих ошибок - это подверженное ошибкам повторяющееся использование $ var (как с начальным $, так и без него). Это кажется очень подверженным ошибкам. Итак, вместо этого я бы использовал подпрограмму:

function set-Variable-IfMissingOrNull ($name, $value)
{
$isMissingOrNull = !(test-path ('variable:'+$name)) -or ((get-variable $name -value) -eq $null)
if ($isMissingOrNull) { set-variable -scope 1 $name $value }
}
set-alias ?? set-Variable-IfMissingOrNull
#...
## in use, must not have a leading $ or the shell attempts to read the possibly non-existant $var
set-VarIfMissingOrNull var "new-value"
?? varX 1

Возможно, это последний способ, которым я написал бы сценарий.

РЕДАКТИРОВАТЬ: Подумав немного над вашим вопросом, я придумал более простую функцию, которая более точно соответствует вашему стилю кодирования. Попробуйте эту функцию:

function test-variable
{# return $false if variable:\$name is missing or $null
param( [string]$name )
$isMissingOrNull = (!(test-path ('variable:'+$name)) -or ((get-variable -name $name -value) -eq $null))
return !$isMissingOrNull
}
set-alias ?-var test-variable
if (!(?-var var)) {$var = "default-value"}

Надеюсь, это поможет.

3 голосов
/ 13 февраля 2009

Во-первых, я люблю ответ Роя, полный и лаконичный. Я просто хотел упомянуть, что кажется, что вы пытаетесь установить переменную, только если она уже установлена. Это похоже на работу с переменными или константами только для чтения.

Чтобы сделать переменную только для чтения, константой, используйте

Set-Variable

С get-help Set-Variable -full

-- ReadOnly: Cannot be deleted or changed without the Force parameter.
-- Constant: Cannot be deleted or changed. Constant is valid only when
creating a new variable. You cannot set the Constant option on an
existing variable.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...