將參數傳送至 Windows PowerShell 中的遠端電腦
您已了解 Invoke-Command 無法在其指令碼區塊或指令碼檔中包含變數,除非遠端電腦可以理解這些變數。 因此,尋找將資料從起始電腦傳遞至遠端電腦的方式可能比較複雜。 不過,Invoke-Command 實際上提供特定的機制以執行這類工作。
為了檢閱,下列命令背後的意圖是顯示每部目標電腦上最新的 10 項安全性事件記錄項目清單。 然而,命令將不會如寫入般運作:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-EventLog –LogName $Log –Newest $Quantity
}
問題在於變數 $Log
和 $Quantity
僅在本機電腦上有意義,且在這些值傳送至遠端電腦之前,並不會插入指令碼區塊中。 因此,遠端電腦不會理解這些變數的意義。
此命令的正確語法如下:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity
透過使用此語法,本機變數會傳遞至 Invoke-Command 的 ArgumentList 變數。 在指令碼區塊內,Param() 區塊已建立,其中包含與值 –ArgumentList 清單相同的變數數目,在此案例中為兩個。 請注意,您可以在 Param() 區塊內將任何名稱指派給變數。 這些變數會根據順序接收來自 ArgumentList 參數的資料。 換句話說,由於 $Log
是 ArgumentList 上的第一個變數,因此其值會傳遞至 $x
,因為這是 Param() 區塊中的第一個項目。 Param() 區塊中的變數則可以在指令碼區塊內部使用,如範例中所述。
此語法適用於 Windows PowerShell 2.0 和更新版本。 不過,Windows PowerShell 3.0 引入簡化的替代方法。 若有本機變數 $variable
且想要在遠端電腦上執行的命令中包含其內容,則您可以執行下列語法:
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
$Using:
前置詞已由本機和遠端電腦正確處理,促使將 $Using:variable
取代為本機變數 $variable
的內容。