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 (@
) 符號來表示 splatted 變數。
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
需要 『Using』 範圍修飾詞的其他情況
對於執行會話外的任何腳本或命令,您需要 Using
範圍修飾詞,才能從呼叫會話範圍內嵌變數值,讓會話程式代碼無法存取它們。 下列 Using
內容支援範圍修飾詞:
- 遠端執行的命令,使用 ComputerName、HostName、SSHConnection 或 Session 參數啟動
Invoke-Command
, (遠端工作階段) - 背景工作,從
Start-Job
(跨進程會話開始) - 線程作業,透過
Start-ThreadJob
或ForEach-Object -Parallel
(個別的線程會話)
根據內容而定,內嵌變數值是呼叫端範圍中數據的獨立複本或參考。 在遠端和跨進程會話中,它們一律是獨立的複本。 在線程會話中,它們會以傳址方式傳遞。
變數值的串行化
遠端執行的命令和背景作業會用盡進程。 跨進程會話使用 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