PowerShell - Как я тестирую на значение переменной с “Набором-StrictMode - последняя версия”?

или просто используйте main () вместо WinMain

15
задан user62129 4 February 2009 в 12:50
поделиться

2 ответа

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

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"}

Hope, которая помогает.

41
ответ дан 1 December 2019 в 00:41
поделиться

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

Для создания переменной только для чтения, константа, использование

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.
3
ответ дан 1 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: