about_Remote_Variables
簡短描述
說明如何在遠端命令中使用本機和遠端變數。
詳細描述
您可以在遠端電腦上執行的命令中使用變數。 將值指派給變數,然後使用 變數取代值。
根據預設,遠端命令中的變數會假設在執行命令的會話中定義。 在本機會話中定義的變數,必須在 命令中識別為局部變數。
使用遠端變數
PowerShell 假設遠端命令中使用的變數是在命令執行所在的會話中定義。
在此範例中, $ps
變數定義於命令執行所在的 Get-WinEvent
暫存會話中。
Invoke-Command -ComputerName S1 -ScriptBlock {
$ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}
當命令在持續性會話中執行時, PSSession 必須在該會話中定義遠端變數。
$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}
使用局部變數
您可以在遠端命令中使用局部變數,但變數必須在本機會話中定義。
從 PowerShell 3.0 開始,您可以使用 Using
範圍修飾詞來識別遠端命令中的局部變數。
的語法 Using
如下所示:
$Using:<VariableName>
在下列範例中, $ps
變數是在本機會話中建立,但在命令執行所在的會話中使用。 Using
範圍修飾詞會$ps
識別為局部變數。
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
Get-WinEvent -LogName $Using:ps
}
Using
範圍修飾詞可以在 PSSession 中使用。
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}
變數參考,例如 $using:var
從呼叫端的內容擴充至變數 $var
的值。 您無法存取呼叫端的變數物件。
範圍Using
修飾詞無法用來修改 PSSession 內的局部變數。 例如,下列程式代碼無法運作:
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}
如需 的詳細資訊 Using
,請參閱 about_Scopes
使用噴濺
PowerShell 展開會將參數名稱和值的集合傳遞至命令。 如需詳細資訊,請參閱 about_Splatting。
在此範例中,展開變數 $Splat
是本機計算機上設定的哈希表。 會 Invoke-Command
連線到遠端電腦會話。 ScriptBlock 會使用Using
範圍修飾詞搭配 At (@
) 符號來代表已展開的變數。
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
需要 「使用」範圍修飾詞的其他情況
針對任何在會話外執行的腳本或命令,您需要 Using
範圍修飾詞來內嵌來自呼叫會話範圍的變數值,讓會話程序代碼可以存取它們。 下列 Using
內容支援範圍修飾詞:
- 遠端執行的命令,以使用 ComputerName 或 Session 參數啟動
Invoke-Command
(遠端工作階段) - 背景工作,從
Start-Job
(跨進程工作) - 透過
Start-ThreadJob
啟動的線程作業(個別線程工作階段)
根據內容,內嵌變數值可以是呼叫端範圍中數據的獨立複本,或是參考數據。 在遠端和跨進程會話中,它們一律是獨立的複本。 在線程會話中,它們會以傳址方式傳遞。
變數值的串行化
遠端執行的命令和背景作業會用盡進程。 跨進程會話會使用以 XML 為基礎的串行化和還原串行化,讓變數的值可跨進程界限使用。 串行化程式會將物件 轉換成包含原始物件屬性但不包含其方法的 PSObject 。
針對一組有限的類型,還原串行化會將物件重新凍結回原始類型。 解除凍結的對像是原始物件實例的複本。 它具有型別屬性和方法。 對於簡單類型,例如 System.Version,複本是確切的。 對於複雜類型,復本不完美。 例如,解除凍結的憑證物件不包含私鑰。
所有其他類型的實例都是 PSObject 實例。 PSTypeNames 屬性包含前面加上還原串行化的原始類型名稱,例如 Deserialized.System.Data.DataTable
搭配 ArgumentList 參數使用局部變數
您可以在遠端命令中使用局部變數,方法是定義遠端命令的參數,並使用 Cmdlet 的 Invoke-Command
ArgumentList 參數,將局部變數指定為參數值。
param
使用 關鍵詞來定義遠端命令的參數。 參數名稱是不需要符合局部變數名稱的佔位元。在命令中使用 關鍵詞所
param
定義的參數。使用 Cmdlet 的
Invoke-Command
ArgumentList 參數,將局部變數指定為參數值。
例如,下列命令會在本機會話中定義 $ps
變數,然後在遠端命令中使用它。 命令使用 $log
做為參數名稱和局部變數, $ps
作為其值。
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps