2013-04-12 102 views
4

我有我的電腦在遠程計算機上運行本地功能?

MYPC> $txt = "Testy McTesterson" 
MYPC> function Do-Stuff($file) { 
    cd c:\temp; 
    $txt > $file; 
} 

我想在遠程計算機

MYPC> Invoke-Command -ComputerName OTHERPC { Do-Stuff "test.txt" } 

上運行它理解,Do-Stuff上不存在OTHERPC一個簡單的功能,這是行不通的。我怎麼能讓它工作? Do-Stuff函數提取一些基本代碼,並在其他幾個地方調用,所以我不想複製它。

請注意,在我的示例中,通過參數和範圍閉包將值傳遞給函數。那可能嗎?

回答

8

我不知道你是怎麼使用的截流值,但是你可以通過這兩個像這樣的參數:

$txt = "Testy McTesterson" 
$file = "SomeFile.txt" 
function Do-Stuff { param($txt,$file) cd c:\temp; $txt > $file } 
Invoke-Command -ComputerName SomeComputer -ScriptBlock ${function:Do-Stuff} -ArgumentList $txt, $file 
+1

這似乎如果函數是在父腳本範圍界定工作。但是,如果您的功能位於本地加載的模塊中,它似乎不起作用。到目前爲止,我還沒有找到解決方案來遠程運行在本地模塊中定義的功能(遠程計算機上沒有該模塊)。 – Robin

+1

爲了澄清我的上述評論,我發現了以下內容:如果函數是在本地模塊中定義的,並且它的位置出現在$ PSModulePath中時自動加載,則該函數不能傳遞給遠程計算機。但是,如果本地模塊顯式加載到父腳本中,則可以將該功能傳遞給遠程計算機。 – Robin

4

不知道是否還有人關心,但實際上你可以加載自定義函數保存在.ps1文件通過PSSession傳輸到遠程計算機。我試了一下,它適用於我。 Check out this guy's solution

+1

鏈接傾向於改變或失蹤,你能解釋一些內容還是在這裏引用它? – abarisone

+0

嘿,真的非常抱歉,對於遲到的回覆。工作和生活優先事項。無論如何,你可以嘗試像我所做的一樣 '調用命令-Session $ myPSSession -FilePath「C:\ dir \ customFunctionFile.ps1」' 只要PSSession是開放的,你應該很好地使用你的任何函數在該加載的文件中定義。當你完成後,不要忘記刪除你的會話,只是作爲一個旁註,當會話被刪除時,加載的文件會被卸載。 LMK如果你需要任何進一步的幫助,但這應該是綽綽有餘......阿羅哈! –

1

更少有人真正在乎的風險:),但這裏有一種方法。

MYPC> $myPCscript = @' 
$txt = "Testy McTesterson" 
function Do-Stuff($file) { 
    cd c:\temp 
    $txt > $file 
} 
'@ 
MYPC> Invoke-Command -ComputerName OTHERPC { Invoke-Expression $using:myPCscript; Do-Stuff "test.txt" } 
相關問題