【问题标题】:Using Invoke-Command -ScriptBlock on a function with arguments在带参数的函数上使用 Invoke-Command -ScriptBlock
【发布时间】:2012-01-16 22:35:29
【问题描述】:

我正在编写一个 PowerShell 脚本,它将使用Invoke-Command 及其-ScriptBlock 参数在远程主机上执行命令。例如,

function Foo {
    ...
    return "foo"
}
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo}

这很好用。我现在想做的是同样的事情,但是用本地参数调用一个函数。例如,

function Bar {
    param( [String] $a, [Int] $b )
    ...
    return "foo"
}
[String] $x = "abc"
[Int] $y = 123
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo($x,$y)}

但这不起作用:

Invoke-Command:无法验证参数“ScriptBlock”上的参数。 参数为空。提供一个非空参数并尝试该命令 再次。

如何将 Invoke-Command 与带有参数的本地函数 -ScriptBlock 一起使用?

我意识到我可以将整个函数和参数包装在一个大代码块中,但在我看来,这不是一种干净的方式。

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    您可以将函数包装在一个块中并传递该块;

    $a = {
      function foo{}
      foo($args)
    }
    
    $a.invoke() // Locally
    
    $rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely
    

    但它并不优雅。

    【讨论】:

      【解决方案2】:

      我想你想要:

      function Foo ( $a,$b) {
          $a
          $b
          return "foo"
      }
      
      $x = "abc"
      $y= 123
      
      Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y
      

      【讨论】:

      • 谢谢,完美!我正在搞乱 param() + -Arguments 的组合,但没有运气。
      • 花了我几个小时才找到这个解决方案 ;-) 比导出/导入会话好多了 谢谢!
      • 我认为正确的格式应该是-ScriptBlock {$function:Foo}(注意$位置)
      • 我试过了,这是它工作的唯一方法${function:Foo}。至少当您具有 ${function:Foo-Bar} 格式时。
      • {$function:Foo}${function:Foo} 有很大的不同。前一个中的花括号表示脚本块,因此表达式的意思是:“在函数范围内解析为变量 foo 的脚本块”。后者中的花括号意味着变量的名称是按字面意思取的,因此它简单地转换为:“函数范围内的变量 foo”。如果“foo”变量的名称中有空格或其他特殊字符,这将很有用。
      【解决方案3】:

      这也有效:

      function foo
      {
          param([string]$hosts, [string]$commands)
          $scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands)
          $hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多