PowerShell将多个参数传递给类方法失败

时间:2019-02-25 23:10:09

标签: function powershell variables methods parameters

我有一个奇怪的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.

我不知道是什么原因导致此错误!你们能帮我调试一下吗?

2 个答案:

答案 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