我有一个包含一些函数的Powershell脚本,以及我想在Invoke-Command块中远程运行这些函数之一(它需要参数并返回void)。
我正在使用Powershell 5.我怎样才能最好地实现这一目标?
非常感谢!
答案 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