这个问题是在另一个问题中的一个评论分拆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的时候使用括号。