在带参数的函数上使用Invoke-Command -ScriptBlock

Chr*_*lan 28 powershell powershell-2.0

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

function Foo {
    ...
    return "foo"
}
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo}
Run Code Online (Sandbox Code Playgroud)

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

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)}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

Invoke-Command:无法验证参数'ScriptBlock'的参数.参数为null.提供非null参数并再次尝试该命令.

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

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

man*_*lds 45

我想你想要:

function Foo ( $a,$b) {
    $a
    $b
    return "foo"
}

$x = "abc"
$y= 123

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y
Run Code Online (Sandbox Code Playgroud)

  • `{$ function:Foo}`和`$ {function:Foo}`之间有很大的不同.前者中的花括号表示scriptblock,因此表达式表示:"在函数范围内解析为变量foo的脚本块." 后者中的花括号意味着变量的名称是文字的,因此它简单地转换为:"函数范围中的变量foo".如果"foo"变量在名称中有空格或其他特殊字符,这将非常有用. (2认同)

rec*_*bot 7

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

$a = {
  function foo{}
  foo($args)
}

$a.invoke() // Locally

$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely
Run Code Online (Sandbox Code Playgroud)

但这并不优雅.