2016-09-16 19 views
1

私はいくつかの関数を持つPowershellスクリプトを持っていますが、Invoke-Commandブロック内からリモートで実行する(パラメータをとり、voidを返します)ローカルで定義された関数をリモートで実行する

私はPowershell 5を使用しています。これをどのように最高に達成できますか?

多くのありがとうございます!

+0

。 – user4317867

答えて

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 

(あなたがいないことに注意してくださいあなたが機能を持っているとしましょう他の側で$fobjPSObjectのタイプであるため、FunctionInfoではない)set-item function:\foo $fobjを実行してください。

fooがローカルマシンで定義されている他の機能を呼び出す場合は、それらも渡す必要があります。したがって、この手法は本当にシンプルな関数の場合にのみ有効です。もっと複雑なものについては、それらをモジュールにカプセル化し、そのモジュールをリモートマシンにインストールすることを検討してください。ここで

0

述べたように、あなたは、引数として関数を渡すことができ、しかし、その代わりGet-Itemを使用することは$Variable = Get-Content Function:\Fooを使用してInvoke-Expressionを使用することはベストプラクティスではないようinvoke-Commandにそれを渡すことをお勧めします。

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

$ VAR1あなたはあなたの関数にパラメータを持っている場合は、あなたがGet-Help Invoke-Command -Parameter Argumentlist

を読めば、それはいいだろう

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

と同様、次に渡す必要がありSystem.Management.Automation.FunctionInfo

型になります

および

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

に関して、コードは単にネットワーク上の場所からそのモジュールをインポートするリモートクライアント上で、モジュールとしての機能に署名

kvprasoon