似乎无法在 powershell 中使用多个参数执行 Function.Invoke?

Can't seem to do a Function.Invoke with multiple parameters in powershell?

我试图将一个函数传递给一个方法,然后将参数传递给调用它时传递的方法,但是如果我传递了多个参数,那么该方法将失败并出现错误:

function debugMeStuffs($someBlah, $somePoo) {

    Write-Host $someBlah            
    Write-Host $somePoo
}


function invokeOnHosts ([scriptblock]$funcToCall, $param1, $param2, $startRange, $endRange) {
#Param($funcToCall)

$i = $startRange

for($i = [int]$startRange; $i -le $endRange; $i++) {

    # HOW DO I MAKE THIS WORK WITH MULTIPLE PARAMETERS?!?!?!?
    $funcToCall.Invoke('blah' 'poo')
}
}

invokeOnHosts $function:debugMeStuffs "param1" "param2" 4 7

我尝试过的事情:

None 以上似乎有效。我还需要做些什么才能完成这项工作吗?

.Invoke() 是一个 .NET 方法 ,所以通常的 方法调用语法适用 :你需要

  • 圆括号 - (...) - 围绕参数列表
  • 你必须用 ,
  • 分隔参数
$funcToCall.Invoke('blah', 'poo')

这与 PowerShell 自己调用 cmdletsfunctions 的语法形成对比,后者是 shell-like[1]:

  • (...) argument list

  • 参数必须用空格分隔

& $funcToCall blah poo  # equivalent of the method call above.

上面的命令在argument mode中被解析,这就是为什么引用这个简单例子中的参数是可选的[=77] =].

注意需要 &,PowerShell 的 call operator执行 脚本块存储在 $funcToCall 中;这对于调用存储在 变量 中的命令以及 引用 .

的命令名称/路径通常是必需的

鉴于很容易混淆 PowerShell 的命令语法和 .NET 的方法语法,最好坚持使用 PowerShell 的原生功能[2],如果可能的话。
也就是说,能够直接调用 .NET 类型的方法是一个很好的扩展选项。

为了帮助避免在调用 PowerShell 命令时意外使用方法语法,您可以使用 Set-StrictMode -Version 2 或更高版本,但请注意,这需要进行额外的严格检查。


[1] PowerShell 毕竟是一个 shell - 但它也是 一个 功能齐全的脚本语言,提供对 .NET 框架近乎无限的访问。
调和这两种性格是一个困难的平衡行为,并且 shell-like 命令调用语法对于具有编程背景的新手来说是一个常见的问题,因为语言的其余部分看起来像传统的编程语言并且调用.NET 类型上的方法 使用传统语法。

[2] 这意味着优先使用 PowerShell 的 cmdlet、函数和 operators 来使用底层 .NET 类型的方法;这样做通常还会奖励您在更高的抽象级别上操作。