共用方式為


關於遠端變數

簡短描述

說明如何在遠端命令中使用區域和遠端變數。

完整描述

您可以在遠端電腦上執行的命令中使用變數。 將值指派給變數,然後使用變數取代值。

根據預設,遠端命令中的變數會假設是在執行命令的會話中定義。 在本機會話中定義的變數,必須在 命令中識別為局部變數。

使用遠端變數

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 Splatting 會將參數名稱和值的集合傳遞至命令。 如需詳細資訊,請參閱 about_Splatting

在此範例中, $Splat splatting 變數是在本機電腦上設定的哈希表。 會 Invoke-Command 連線到遠端電腦會話。 ScriptBlockUsing使用範圍修飾詞搭配 At (@) 符號來表示 splatted 變數。

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

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

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

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

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

變數值的串行化

遠端執行的命令和背景作業會用盡進程。 跨進程會話使用 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

另請參閱

about_PSSessions

about_Remote

about_Scopes

about_Splatting

about_Variables

Enter-PSSession

Invoke-Command

New-PSSession

Start-ThreadJob