我正在编写一段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”上的参数。该参数为空。提供非空参数,然后再试一次。
我应该如何使用带有参数的本地函数作为-ScriptBlock
的Invoke-Command?
我知道可以将整个函数和参数都包装在一个大代码块中,但在我看来,这不是一个干净的方法。
-ScriptBlock {$function:Foo}
(注意$
的位置)。 - Mourndark{$function:Foo}
和${function:Foo}
之间有很大的区别。前者中的花括号表示脚本块,因此该表达式的含义为:“在函数作用域中解析为变量foo的脚本块。” 后者中的花括号表示变量名被按字面意思解释,因此它简单地翻译为:“函数范围内的变量foo。” 如果“foo”变量的名称带有空格或其他特殊字符,则这将非常有用。 - nohwnd