7

ここのコードに微妙な間違いがあり、これは実際には Powershell の動作方法ではないことを教えてください。

$in = ""

if ($in -ne $null)
{
    switch ($in)
    {
        $null { echo "This is impossible" }
        default { echo "out here!"  }
    }
}

すべての適切で正直なロジックは、このスクリプトが「This is possible 」と出力するべきではないことを示しています。ただし、 $in が空の文字列の場合はそうです。そのため、Powershell では、空の文字列と文字列はステートメントnull内では同等と見なされますがswitchステートメント内では同等と見なされないifように見えます。これは非常に紛らわしく、多くの人が Powershell の使用をためらう主な理由の 1 つです。

なぜこれが事実なのか、誰かが私に教えてもらえますか?舞台裏でスイッチが実際に何をしているか知っている人はいますか? 確かに、単純な -eq 比較を行っているわけではありません。

4

3 に答える 3

8

Powershell は自動的に $null を空の文字列にキャストします。したがって、.NET API 呼び出しで $null を使用すると、Powershell は実際にはそれを空の文字列にキャストします。API 呼び出しで実際の null 値を渡すには、代わりに [NullString]::Value を使用します。

于 2013-03-06T02:33:15.773 に答える
5

これはpowershell 2.0のバグだと思います(MSFT Connectに関する情報はこちら)。

v 3.0 では return をコーディングすると言えます。out here!

于 2012-10-11T13:22:53.390 に答える
1

次のステートメント$nullは、switch ステートメントの空の文字列と同等ではないことを示しています。

$a=""; switch ($a){$null {"null"} "" {"empty string"}}

$a=$null; switch ($a){$null {"null"} "" {"empty string"}}
于 2016-03-17T19:03:29.350 に答える