Заметки о Windows и других программных продуктах Microsoft...

Проверяем значение переменной в PowerShell

Проверяем значение переменной в PowerShell

Иногда бывает необходимо проверить, имеет ли переменная какое либо значение. Казалось бы, самый простой способ — это сравнить ее с встроенной переменной $null, примерно так:

if ($var -eq $null) {Write-Host ″My variable is NULL″}

Однако этот способ лучше не использовать. Он не очень надежен и периодически выдает совсем не то, что ожидаeшь. Для того, чтобы проверить, имеет ли переменная значение $null, лучше применять такой вариант:

if (!$var) {Write-Host ″My variable is NULL″}

переменная пуста

 

А проверить, имеет ли переменная какое либо значение, отличное от $null, можно так:

if ($var) {Write-Host ″My variable is NOT NULL″}

переменная имеет значение

 
 
Комментарии
Дмитрий

Ну, извините, конечно. Но неужели прежде чем это писать и использовать не хотелось/не нужно было проверить? В вашем варианте любые пустые значения, как 0, », false, пустой ArrayList, возможно некоторые другие коллекции, будут определяться как null… пустой hashtable определеяется не как null. И на последок, в сообщениях где нет нужды в заменах переменных используйте одинарные кавычки.

Я данную конструкцию давно и успешно использую в скриптах. Есть конкретный пример того, когда она работает некорректно?
По поводу кавычек — в данном случае без разницы, как говорится «дело вкуса».

Пользователь Админ

исходный посыл заметки подкупает профессионализмом, но вот «решение» идущее советом на замену настораживает, ибо проверка в духе if (!$var) выглядит подозрительно для любого С-программиста. придётся проверить информацию хотя бы на очевидных и простейших случаях/типах:

$varr=0
if ($varr) { Write-Host «$varr есть» }
else { Write-Host «$varr пусто» }

if ($varr -eq $null) { Write-Host «$varr пусто» }
else { Write-Host «$varr есть» }

$varr=$null
if ($varr) { Write-Host «$varr есть» }
else { Write-Host «$varr пусто» }

if ($varr -eq $null) { Write-Host «$varr пусто» }
else { Write-Host «$varr есть» }

$varr=$false
if ($varr) { Write-Host «$varr есть» }
else { Write-Host «$varr пусто» }

if ($varr -eq $null) { Write-Host «$varr пусто» }
else { Write-Host «$varr есть» }

$varr=$true
if ($varr) { Write-Host «$varr есть» }
else { Write-Host «$varr пусто» }

if ($varr -eq $null) { Write-Host «$varr пусто» }
else { Write-Host «$varr есть» }

ожидается что Write-Host $varr выдаст значение как его видит PS, ну а далее наш диагноз. и вот что выходит

0 пусто
0 есть
пусто
пусто
False пусто
False есть
True есть
True есть

т.е. 0 и False предложенный в заметке способ воспринимает неправильно. осталось спросить — где классический способ ($var -eq $null) даёт неправильный результат?

Возможно я был излишне категоричен) Использовать можно оба способа, в зависимости от обстоятельств. Я в свое время при отладке скрипта столкнулся некорректной работой классического способа. Пример, к сожалению, привести не смогу. Не сохранился. По поводу примеров:
$varr=0
!$varr
True
$varr -eq $null
False
Здесь все верно, нулевое значение воспринимается как $false.
PS C:\> $varr=$false
!$varr
True
$varr -eq $null
False
Здесь $true и $false имеют свои обычные значения. Соответственно !$varr возвращает значение, обратное $false.

Спасибо! Заметка помогла!

Leave a Reply to Дмитрий