这个问题是另一个问题中的评论的衍生问题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 时使用括号是违反常理的。