请告诉我,我的代码中存在一个微妙的错误,而这实际上并不是Powershell的运作方式。
$in = ""
if ($in -ne $null)
{
switch ($in)
{
$null { echo "This is impossible" }
default { echo "out here!" }
}
}
所有善良,诚实的逻辑说,这个剧本不应该打印出“这是不可能的”。但它确实如果$ in是一个空字符串。因此,在Powershell中,似乎空字符串和null
字符串在switch
语句中被认为是等效的,而在if
语句中则不是。这是所以令人困惑,是许多人回避使用Powershell的主要原因之一。
任何人都可以告诉我为什么会这样吗?有谁知道幕后实际做了什么开关?它肯定没有进行直接的比较。
答案 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"}}