Powershell在switch语句中将空字符串视为等效于null,而不是if语句

时间:2012-10-11 12:25:14

标签: powershell null

请告诉我,我的代码中存在一个微妙的错误,而这实际上并不是Powershell的运作方式。

$in = ""

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

所有善良,诚实的逻辑说,这个剧本不应该打印出“这是不可能的”。但它确实如果$ in是一个空字符串。因此,在Powershell中,似乎空字符串和null字符串在switch语句中被认为是等效的,而在if语句中则不是。这是所以令人困惑,是许多人回避使用Powershell的主要原因之一。

任何人都可以告诉我为什么会这样吗?有谁知道幕后实际做了什么开关?它肯定没有进行直接的比较。

3 个答案:

答案 0 :(得分:8)

Powershell会自动将$ null转换为空字符串。因此,在.NET API调用上使用$ null时,Powershell实际上将其强制转换为空字符串。要在API调用中传递实际的空值,请改为使用[NullString] :: Value。

答案 1 :(得分:5)

我认为是PowerShell 2.0的错误(这里有MSFT Connect的一些信息)。

我可以说在v 3.0中你的代码返回out here!

答案 2 :(得分:0)

以下陈述表明$null不等同于switch语句中的空字符串。

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

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