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

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

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

Get-PwdLastSet('grz') 

我收到了我真正感激的以下暗示:

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

我知道了。 但我想问问为什么呢? 圆括号是什么意思呢?

Powershell是一个parsing和解释的语言。 口译员将括号视为控制结构 ,不在呼叫站点预期或要求。 考虑下面的示例函数:

 function test-function { param ( [string] $string, [string] $word ) "String: $string. Word: $word" } 

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

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

微软Powershell的创build者想要创build一个新的产品来replacecmd shell和vbscript。 Powershell的主要目标之一是标准化cmdlet命名,调用站点策略,命名和输出(作为对象)。 有趣的是,另一个主要焦点是消除了vbscript的安全漏洞。

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

 Test-Function "Hello" "World" 

这两个例子都会输出如下内容:

 "String: Hello. Word: World" 

那么如果我们决定在呼叫站点使用括号会发生什么?

 Test-Function("Hello","World") "String: Hello World. Word:" 

所以发生了什么事? Powershell将我们的input解释为包含传递给第一个(位置)variables的两个string的单个数组。 为了使用圆括号得到想要的结果,你必须这样做:

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

我们发送两个受控结构(通过结构思考对象types,在这种情况下,它们都是[String]types),如函数所示。 它击中眼睛不对?

我希望这可以帮助你理解为什么在调用函数和cmdlet的时候使用括号。