7

请告诉我,我的代码中有一个细微的错误,这实际上不是 Powershell 的操作方式。

$in = ""

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

所有好的,诚实的逻辑都说这个脚本永远不应该打印出“这是不可能的”。但是,如果 $in 是一个空字符串,它确实如此。所以在 Powershell 中,空字符串和字符串null语句中被认为是等价的,但在语句中却不是。这非常令人困惑,也是许多人回避使用 Powershell 的主要原因之一。switchif

谁能告诉我为什么会这样?有谁知道switch在幕后实际上在做什么?它当然不是直接进行-eq 比较。

4

3 回答 3

8

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

于 2013-03-06T02:33:15.773 回答
5

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

我可以说在 v 3.0 中你的代码返回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 回答