2011-12-09 35 views
25

我正在編寫一個PowerShell腳本,它將使用Invoke-Command及其-ScriptBlock參數在遠程主機上執行命令。例如,在帶參數的函數上使用Invoke-Command -ScriptBlock

function Foo { 
    ... 
    return "foo" 
} 
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo} 

這工作正常。我現在想要做的是同樣的事情,但用本地參數調用一個函數。例如,

function Bar { 
    param([String] $a, [Int] $b) 
    ... 
    return "foo" 
} 
[String] $x = "abc" 
[Int] $y = 123 
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo($x,$y)} 

但是,這並不工作:

調用命令:在參數「腳本塊」無法驗證的說法。 參數爲空。提供一個非空參數並再次嘗試命令 。

如何使用帶有參數的本地函數-ScriptBlock的Invoke-Command?我意識到我可以將整個函數和參數包裝在一個大代碼塊中,但這不是一個乾淨的方法。

回答

41

我想你想:

function Foo ($a,$b) { 
    $a 
    $b 
    return "foo" 
} 

$x = "abc" 
$y= 123 

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y 
+0

,完美的作品!我搞亂了param()+ -Arguments的組合,沒有運氣。 –

+0

花了我幾個小時才找到這個解決方案;-) 比導出/導入會話好得多 謝謝! – icnivad

+0

我相信正確的格式應該是'-ScriptBlock {$ function:Foo}'(note'$'position) – Mourndark

7

可以將函數包裝在一個塊中並傳遞該塊;

$a = { 
    function foo{} 
    foo($args) 
} 

$a.invoke() // Locally 

$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely 

雖然不是很高雅。

+0

我想避免這種情況。感謝的人, –

2

這也適用於:

function foo 
{ 
    param([string]$hosts, [string]$commands) 
    $scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands) 
    $hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock } 
}