將參數傳送至 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-CommandArgumentList 參數。 在腳本區塊中,會建立 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 的內容。