Powershell рассматривает пустую строку как эквивалент null в операторах switch, но не операторы if
пожалуйста, скажите мне, что у меня есть тонкая ошибка в моем коде здесь и что на самом деле это не так, как работает Powershell.
$in = ""
if ($in -ne $null)
{
switch ($in)
{
$null { echo "This is impossible" }
default { echo "out here!" }
}
}
вся хорошая, честная логика говорит, что этот скрипт никогда не должен распечатываться"это невозможно". Но это так, если $in-пустая строка. Таким образом, в Powershell окажется, что пустая строка и null
строки считаются эквивалентными на switch
заявление, но не в if
сообщении. Это так запутанный и является одной из основных причин, по которым многие люди уклоняются от использования Powershell.
может кто-нибудь просветить меня, почему это так? Кто-нибудь знает, что switch на самом деле делает за кулисами? Это, конечно, не делает прямое сравнение эквалайзера.
3 ответов
Я думаю, что это ошибка powershell 2.0 (здесь некоторая информация о MSFT Connect).
Я могу сказать, что в V 3.0 Вы код возврата out here!
Powershell автоматически магически бросает $null в пустую строку. Следовательно, при использовании $null в вызове API .NET Powershell фактически приводит его к пустой строке. Чтобы передать фактическое значение null в вызове API, используйте вместо него [NullString]::Value.
следующие утверждения показывают, что $null
не эквивалентно пустой строке в инструкции switch.
$a=""; switch ($a){$null {"null"} "" {"empty string"}}
$a=$null; switch ($a){$null {"null"} "" {"empty string"}}