远程运行本地定义的函数

问题描述:

我有一个Powershell脚本,它具有一些函数,并且我想从Invoke-Command块内远程运行这些函数之一(它需要参数并返回void)。远程运行本地定义的函数

我正在使用Powershell 5.我该如何最好地实现这一目标?

非常感谢!

+0

代码签名功能的模块,然后在远程客户端上刚刚导入模块从网络位置。 – user4317867

您可以将类型为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调用了本地机器上定义的一些其他函数,那么您也必须将它们传递给它们。因此,这种技术仅适用于非常简单的功能。对于更复杂的应用,可以考虑将它们封装在一个模块中并在远程机器上安装该模块。

在这里,您可以传递函数作为参数如提及,但不是使用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

这将是很好

and

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

问候,

kvprasoon