代码之家  ›  专栏  ›  技术社区  ›  leeand00

似乎无法执行函数。是否在PowerShell中使用多个参数调用?

  •  1
  • leeand00  · 技术社区  · 6 年前

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

    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"

    以上这些似乎都不起作用。我还需要做些什么来完成这项工作吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   mklement0    6 年前

    .Invoke() 是.NET 方法 如此平常 方法调用语法适用 你需要

    • 括号- (...) -在参数列表周围
    • 你必须用 ,
    $funcToCall.Invoke('blah', 'poo')
    

    这与 PowerShell自己的调用语法 添加命令 功能 ,这就是 壳状的 〔1〕 :

    • (…) 在参数列表周围

    • 参数必须用分隔 空间 .

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

    在中分析上述命令 argument mode 这就是为什么 引用 在这个简单的例子中,参数是 可选择的 .

    注意需要 & 电力壳牌公司 call operator ,需要 执行 这个 脚本块 存储在 $funcToCall ;调用存储在 变量 以及命令名/路径 引用 .


    由于很容易混淆PowerShell的命令语法和.NET的方法语法,因此 最好坚持使用PowerShell本机功能 〔2〕 ,如果可能的话。
    也就是说,能够直接调用.NET类型上的方法是一个很好的扩展性选项。

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


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

    [2]这意味着首选PowerShell的Cmdlet、函数和 operators 使用底层.NET类型的方法;这样做通常也会为您提供在更高抽象级别上操作的奖励。