簡短描述
說明如何在遠端命令中使用本機和遠端變數。
完整描述
您可以在遠端電腦上執行的命令中使用變數。 將值指派給變數,然後使用 變數取代值。
根據預設,遠端命令中的變數會假設在執行命令的會話中定義。 在本機會話中定義的變數,必須在 命令中識別為局部變數。
使用遠端變數
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 會使用具有 At (Using:) 符號的 @ 範圍修飾詞來表示 splatted 變數。
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
需要 Using: 範圍修飾詞的其他情況
對於任何在會話範圍之外執行的腳本或命令,您需要使用 Using: 範圍修飾詞,將變數值從呼叫會話範圍嵌入,這樣,以會話範圍之外運行的程式碼才能訪問這些變數。 下列內容支援 Using: 範圍修飾詞:
- 使用
Invoke-Command遠端執行命令,透過 ComputerName、HostName、SSHConnection 或 Session 參數來啟動 - 背景工作,從
Start-Job開始(進程外的工作階段) - 線程作業,透過
Start-ThreadJob或ForEach-Object -Parallel啟動(個別線程會話)
根據內容,內嵌變數值可以是呼叫端範圍中數據的獨立複本,或是參考數據。 在遠端和跨進程會話中,它們一律是獨立的複本。 在執行緒會話中,物件是以引用方式傳遞的。
變數值的串行化
遠端執行的命令和背景作業在獨立進程中運行。 跨進程會話會使用以 XML 為基礎的串行化和還原串行化,讓變數的值可跨進程界限使用。 串行化程式會將物件轉換成包含原始物件屬性,但不包含其方法的 PSObject。
針對一組有限的類型,反序列化會將物件恢復為原始類型。 解除凍結的對像是原始物件實例的複本。 它具有型別屬性和方法。 對於簡單類型,例如 System.Version,複製是精確的。 對於複雜類型,復本不完美。 例如,解除凍結的憑證物件不包含私鑰。
所有其他類型的實例都是 PSObject 的實例。 pstypenames 屬性包含前面加上 還原串行化的原始類型名稱,例如,還原串行化.System.Data.DataTable
搭配 ArgumentList 參數使用局部變數
您可以在遠端命令中使用局部變數,方法是定義遠端命令的參數,並使用 Cmdlet 的 Invoke-Command 參數,將局部變數指定為參數值。
使用
param關鍵詞來定義遠端命令的參數。 參數名稱是佔位符,不必與局部變數名稱一致。在命令中使用
param關鍵詞所定義的參數。使用 Cmdlet 的
Invoke-Command參數,將局部變數指定為參數值。
例如,下列命令會在本機會話中定義 $ps 變數,然後在遠端命令中使用。 此命令會使用 $Log 作為參數名稱,而局部變數 $ps作為其值。
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($Log)
Get-WinEvent -LogName $Log
} -ArgumentList $ps