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