2014-02-13 40 views
0

我有腳本庫上的常見幫手等方法,我想直接使用它們在PowerShell遠程處理,我怎麼不知道如何將它們傳遞到其他目標腳本機器。Powershell,pas功能作爲表達式到遠程計算機

我試圖通功能的腳本塊,並在遠程服務器上執行它,在本地計算機的一切工作正常:

function test { write-host "abc" } 
Invoke-Command -ScriptBlock {Param($1) & $1} -ArgumentList ${Function:Test} 

打印「ABC」

但是以下不工作:

function test { write-host "abc" } 
Invoke-Command -ScriptBlock {Param($1) & $1} -ArgumentList ${Function:Test} -ComputerName "OTHERCOMPUTER" -Credential $cred 

術語'寫主機'abc「'不被識別爲cmdlet,函數,腳本文件或可操作程序的名稱。檢查名稱的拼寫,或者如果包含路徑,請驗證路徑是否正確,然後重試。 + CategoryInfo:ObjectNotFound:(寫主機 「ABC」:字符串)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException

任何想法有什麼不好?

編輯: 爲了澄清下面的答案,其中函數本身在scriptblock中定義不適用,因爲函數是從僅位於使用遠程的計算機上的通用腳本文件中獲取的。它們就像「GetConfigurationFromAppConfig」,「SelectFromDatabase」等。

如果我爲每個腳本塊寫入函數,那麼我必須一遍又一遍地複製相同的代碼。我不想使用「通用」腳本位置,因爲每個計算機都可以在塊內部加載腳本(例如「\ SharedLocation \」),因爲它很脆弱(很多依賴性),並且必須針對每個服務器遠程處理(大量維護)。

+0

剛剛發現一個更好的答案! http://stackoverflow.com/questions/8448808/using-invoke-command-scriptblock-on-a-function-with-arguments – Raf

回答

0

Invoke-Command -ScriptBlock {function test { write-host "abc" }; test} -ComputerName "OTHERCOMPUTER" -Credential $cred

+0

編輯的問題,這是我試圖避免的解決方案。 – savpek

+0

回覆:編輯 - 您必須讓遠程計算機「意識到」您要執行的額外功能,方法是將它們包含在腳本塊中或通過'import-module'導入它們。 – Raf

0

另一種選擇是使用[ScrtiptBlock]::Create()建立使用在您的本地會話已​​經聲明函數定義腳本。這樣可以節省您不必手動重新創建遠程腳本調用內部的函數的所有代碼:

function test { write-host "abc" } 

$SB = [ScriptBlock]::Create(@" 
function test {$Function:test} 
test 
"@) 

$SB 


function test { write-host "abc" } 
test 

然後,只需調用遠程計算機上$ SB。

編輯:

每補充意見,如果你有一個腳本文件的遠程計算機上的庫,其中的函數聲明,你可以點源他們在您的腳本塊:

$SB = { 
. 'c:\scripts\myfunctions.ps1' 
test 
} 

Invoke-Command -ScriptBlock $SB -ComputerName 'OTHERCOMPUTER' 
0

在我需要利用自定義函數/資源庫的情況下,我只在我的scriptblock中使用Import-Module。這對我來說似乎是最乾淨的實現......我可以在這裏訪問數百個自定義函數。