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

Ric*_*ban 7 powershell null

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

$in = ""

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

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

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

小智 8

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

  • 另请注意,`[NullString] :: Value -eq $ null`返回False.你需要将字符串与`[NullString] :: Value`进行比较......这使得它通常不切实际.它更容易使用`[字符串] :: IsNullOrEmpty()`和`[字符串] :: IsNullOrWhiteSpace()`的字符串比较,但是这意味着' '''是一个空字符串.如果您正在使用SQL,这可能会使生活变得复杂,特别是因为您经常需要使用`[System.DBNull] :: Value`,它也不等于`$ null`并且不等于`[NullString] :: Value`. (3认同)

CB.*_*CB. 5

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

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