我有一个奇怪的PowerShell问题。我试图将多个参数传递给类方法,但是失败。我能够将多个参数传递给全局函数,并且可以正常工作。尝试将可变数量的参数传递给类方法失败了!
这是我的代码:
class TestParams {
[int] $dummyVar
TestParams() {
$this.dummyVar = 0
}
[void]myMethod() {
for ($index = 0; $index -lt $args.Count; $index++) {
Write-Host $args[$index]
}
}
}
function testFunc() {
for ($index = 0; $index -lt $args.Count; $index++) {
Write-Host $args[$index]
}
}
testFunc '1' '2' '3' # works
$myTestObj = New-Object TestParams
$myTestObj.myMethod "A" "B" "C" # fails
从运行我的代码可以看到,它给出错误消息,例如:
At C:\*****\testParams.ps1:25 char:21 + $myTestObj.myMethod "A" "B" "C" + ~~~ Unexpected token '"A"' in expression or statement.
我不知道是什么原因导致此错误!你们能帮我调试一下吗?
答案 0 :(得分:1)
您需要在方法定义中声明参数:
[void]
myMethod( [array]$arguments ) {
for ($index = 0; $index -lt $arguments.Count; $index++) {
Write-Host $arguments[$index]
}
}
请注意,我有意将自动变量名称args
更改为其他名称,否则它将不起作用。
为了调用该方法,请使用以下语法:
$myTestObj.myMethod(@('A', 'B', 'C'))
# or
$argument = 'A', 'B', 'C'
$myTestObj.myMethod($argument)
答案 1 :(得分:1)
PowerShell custom classes(PSv5 +)的工作原理更像C#代码 ,而不像PowerShell函数和脚本:
方法/构造函数声明以及调用必须使用 method 语法,即列表中的(...)
,
分隔的参数而不是 command 语法(空格分隔的参数不包含的(...)
);例如,如果.MyMethod()
具有3个不同的参数:
$obj.MyMethod('A', 'B', 'C')
而非$obj.MyMethod 'A' 'B' 'C'
您传递的任何参数都必须绑定到正式声明的参数 -不支持通过自动变量访问任意参数的 { {1}}。 [1]
没有没有隐式输出的行为:除非方法未声明返回类型或不使用$Args
,否则它们必须使用[void]
返回值。
Mathias R. Jessen's helpful answer显示了如何通过 array 参数以不限数量的参数来实现您的方法,该方法模拟了{em> functions < / em>。
[1]由于PowerShell Core 6.2.0-rc.1中的一个错误,return
可以意外地在方法中被引用-尽管尚未初始化-但始终会得出< em>空数组-参见this GitHub issue。