远程运行本地定义的功能

时间:2016-09-16 21:22:52

标签: powershell powershell-remoting

我有一个包含一些函数的Powershell脚本,以及我想在Invoke-Command块中远程运行这些函数之一(它需要参数并返回void)。

我正在使用Powershell 5.我怎样才能最好地实现这一目标?

非常感谢!

2 个答案:

答案 0 :(得分:0)

您可以将类型为FunctionInfo的对象传递给远程命令,然后在另一端重新创建该函数。假设你有一个功能:

function foo($a) { write-host "foo says: $a" }

然后你可以获得一个FunctionInfo:

$f = get-item function:\foo

现在将它作为参数传递给远程命令:

Invoke-Command "computer1" { 
    param($fobj) 
    invoke-expression "function $($fobj.name) { $($fobj.ScriptBlock) }"
    foo "hello!"
} -ArgumentList $f

(请注意,您不能只set-item function:\foo $fobj,因为另一方$fobj的类型为PSObject,而不是FunctionInfo。)

如果foo调用本地计算机上定义的其他函数,则必须将它们传递给它们。因此,该技术仅适用于非常简单的功能。对于更复杂的,请考虑将它们封装在模块中并将该模块安装在远程计算机上。

答案 1 :(得分:0)

在这里你可以将函数作为参数传递,但不是使用Get-Item,最好使用$Variable = Get-Content Function:\Foo并将其传递给invoke-Command,因为使用Invoke-Expression是不是最佳实践。

Invoke-Command -ComputerName -$Server -ScriptBlock {Param($Var1)
$Var1 #This will execute your function as usual.
} -ArgumentList $Variable

$ Var1的类型为System.Management.Automation.FunctionInfo

如果您的函数有参数,则必须通过

传递
Invoke-Command -ComputerName -$Server -ScriptBlock {Param($Var1,$Par1,$Par2)
$Var1 $Par1 $Par2 #This will execute your function as usual.
} -ArgumentList $Variable,$Param1,$Param2

如果您阅读Get-Help Invoke-Command -Parameter Argumentlist

,那就太好了

https://powershell.org/2012/08/06/ebook-secrets-of-powershell-remoting/

的问候,

kvprasoon