为什么在 Powershell 中用括号调用函数是错误的?

为什么在 Powershell 中用括号调用函数是错误的?

这个问题是另一个问题中的评论的衍生问题Powershell 无法从 Active Directory 检索 pwdLastSet

这是我尝试像这样调用该函数的地方:

 Get-PwdLastSet('grz')

我收到了以下令我非常感激的提示:

...首先,不要使用括号 () 在 PowerShell 中调用函数(它在语法上有效,但在语义上是错误的)。执行该函数的正确方法只是 Get-PwdLastSet grz...

我明白了。但我想问——这是为什么?那么括号是什么意思?

答案1

Powershell 是一种解析和解释型语言。解释器将括号视为控制结构并且不期望或要求呼叫站点.考虑以下示例函数:

function test-function {

    param
    (
    [string]
    $string,

    [string]
    $word
    )

    "String: $string.  Word: $word"

}

调用该函数的正确方法如下:

Test-Function -String "Hello" -Word "World"

微软的 Powershell 创建者希望创建一个可以取代 cmd shell 和 vbscript 的新产品。Powershell 的主要目标之一是标准化 cmdlet 命名、调用站点过程、开关命名和输出(作为对象)。有趣的是,另一个主要重点是消除 vbscript 的安全漏洞。

默认情况下,Powershell cmdlet超载这样就可以像这样调用相同的示例函数:

Test-Function "Hello" "World"

这两个示例都将输出以下内容:

"String: Hello.  Word: World"

那么如果我们决定在调用处使用括号会发生什么?

Test-Function("Hello","World")

"String: Hello World.  Word:"

那么发生了什么?Powershell 将我们的输入解释为一个包含两个字符串的数组,这两个字符串被传递给第一个(位置)变量。要使用括号获得所需的结果,您必须执行以下操作:

Test-Function("Hello")("World")

我们正在向函数发送两个受控结构(按结构考虑对象类型。在本例中,它们都是 类型[String]),如括号所示。这看起来不太对劲,不是吗?

我希望这有助于您理解为什么在调用函数和 cmdlet 时使用括号是违反常理的。

相关内容