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

Grz*_*zki 8 powershell

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

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

 Get-PwdLastSet('grz')
Run Code Online (Sandbox Code Playgroud)

我收到以下提示,我非常感谢:

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

我得到它。但我想问 - 为什么会这样?那么括号是什么意思呢?

Col*_*337 9

Powershell 是一种解析和解释的语言。解释器将括号视为控制结构,在调用站点不需要或不需要。考虑以下示例函数:

function test-function {

    param
    (
    [string]
    $string,

    [string]
    $word
    )

    "String: $string.  Word: $word"

}
Run Code Online (Sandbox Code Playgroud)

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

Test-Function -String "Hello" -Word "World"
Run Code Online (Sandbox Code Playgroud)

Microsoft 的 Powershell 的创建者希望创建一个新产品来替代 cmd shell 和 vbscript。Powershell 的主要目标之一是标准化 cmdlet 命名、调用站点程序、开关命名和输出(作为对象)。有趣的是,另一个主要焦点是消除 vbscript 的安全缺陷。

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

Test-Function "Hello" "World"
Run Code Online (Sandbox Code Playgroud)

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

"String: Hello.  Word: World"
Run Code Online (Sandbox Code Playgroud)

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

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

"String: Hello World.  Word:"
Run Code Online (Sandbox Code Playgroud)

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

Test-Function("Hello")("World")
Run Code Online (Sandbox Code Playgroud)

我们正在向函数发送两个受控结构(按结构认为对象类型。在这种情况下,它们都是 type [String]),如括号所示。它击中眼睛是错误的,不是吗?

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


归档时间:

查看次数:

4732 次

最近记录:

8 年,9 月 前