共用方式為


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 連線到遠端電腦會話。 ScriptBlockUsing使用範圍修飾詞搭配 At (@) 符號來表示 splatted 變數。

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

需要 『Using』 範圍修飾詞的其他情況

對於執行會話外的任何腳本或命令,您需要 Using 範圍修飾詞,才能從呼叫會話範圍內嵌變數值,讓會話程式代碼無法存取它們。 下列 Using 內容支援範圍修飾詞:

  • 遠端執行的命令,使用 ComputerNameHostNameSSHConnectionSession 參數啟動Invoke-Command, (遠端工作階段)
  • 背景工作,從 Start-Job (跨進程會話開始)
  • 線程作業,透過 Start-ThreadJobForEach-Object -Parallel (個別的線程會話)

根據內容而定,內嵌變數值是呼叫端範圍中數據的獨立複本或參考。 在遠端和跨進程會話中,它們一律是獨立的複本。 在線程會話中,它們會以傳址方式傳遞。

變數值的串行化

遠端執行的命令和背景作業會用盡進程。 跨進程會話使用 XML 型串行化和還原串行化,讓變數的值可跨進程界限使用。 串行化程式會將物件轉換成包含原始物件屬性,但不包含其方法的 PSObject

針對一組有限的類型,還原串行化會將物件重新凍結回原始類型。 解除凍結的對像是原始物件實例的複本。 它具有型別屬性和方法。 針對簡單類型,例如 System.Version,複本是確切的。 針對複雜類型,復本不精確。 例如,解除凍結的憑證物件不包含私鑰。

所有其他類型的實例都是 PSObject 實例。 PSTypeNames 屬性包含前面加上還原串行化的原始類型名稱,例如 Deserialized.System.Data.DataTable

搭配 ArgumentList 參數使用局部變數

您可以在遠端命令中使用局部變數,方法是定義遠端命令的參數,並使用 Cmdlet 的 Invoke-CommandArgumentList 參數,將局部變數指定為參數值。

  • param使用 關鍵詞來定義遠端命令的參數。 參數名稱是不需要符合局部變數名稱的佔位元。

  • 在命令中使用 關鍵詞所 param 定義的參數。

  • 使用 Cmdlet 的 Invoke-CommandArgumentList 參數,將局部變數指定為參數值。

例如,下列命令會在本機會話中定義 $ps 變數,然後在遠端命令中使用它。 命令會使用 $log 作為參數名稱,並使用局部變數 $ps作為其值。

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($log)
  Get-WinEvent -LogName $log
} -ArgumentList $ps

另請參閱