此问题是对另一个问题Powershell 无法从 Active Directory 检索 pwdLastSet 中的评论的衍生
这是我尝试像这样调用函数的地方:
Get-PwdLastSet('grz')
Run Code Online (Sandbox Code Playgroud)
我收到以下提示,我非常感谢:
...首先,不要使用括号 ( ) 在 PowerShell 中调用函数(它在语法上是有效的,但在语义上是错误的)。执行该函数的正确方法是 Get-PwdLastSet grz ...
我得到它。但我想问 - 为什么会这样?那么括号是什么意思呢?
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 次 |
最近记录: |