远程运行本地定义的函数
我有一个Powershell脚本,它具有一些函数,并且我想从Invoke-Command块内远程运行这些函数之一(它需要参数并返回void)。远程运行本地定义的函数
我正在使用Powershell 5.我该如何最好地实现这一目标?
非常感谢!
您可以将类型为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
代码签名功能的模块,然后在远程客户端上刚刚导入模块从网络位置。 – user4317867