似乎无法在 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
我尝试过的事情:
$funcToCall("blah" "poo")
$funcToCall('blah' 'poo')
$funcToCall.Invoke("blah" "poo")
$funcToCall.Invoke('blah' 'poo')
$funcToCall 'blah' 'poo'
$funcToCall.Invoke 'blah' 'poo'
$funcToCall "blah" "poo"
$funcToCall.Invoke "blah" "poo"
None 以上似乎有效。我还需要做些什么才能完成这项工作吗?
.Invoke()
是一个 .NET 方法 ,所以通常的 方法调用语法适用 :你需要
- 圆括号 -
(...)
- 围绕参数列表
- 你必须用
,
分隔参数
$funcToCall.Invoke('blah', 'poo')
这与 PowerShell 自己调用 cmdlets 和 functions 的语法形成对比,后者是 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 类型的方法;这样做通常还会奖励您在更高的抽象级别上操作。
我试图将一个函数传递给一个方法,然后将参数传递给调用它时传递的方法,但是如果我传递了多个参数,那么该方法将失败并出现错误:
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
我尝试过的事情:
$funcToCall("blah" "poo")
$funcToCall('blah' 'poo')
$funcToCall.Invoke("blah" "poo")
$funcToCall.Invoke('blah' 'poo')
$funcToCall 'blah' 'poo'
$funcToCall.Invoke 'blah' 'poo'
$funcToCall "blah" "poo"
$funcToCall.Invoke "blah" "poo"
None 以上似乎有效。我还需要做些什么才能完成这项工作吗?
.Invoke()
是一个 .NET 方法 ,所以通常的 方法调用语法适用 :你需要
- 圆括号 -
(...)
- 围绕参数列表 - 你必须用
,
分隔参数
$funcToCall.Invoke('blah', 'poo')
这与 PowerShell 自己调用 cmdlets 和 functions 的语法形成对比,后者是 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 类型的方法;这样做通常还会奖励您在更高的抽象级别上操作。