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、HostNameSSH 連線 ion會話參數 (遠端會話) 開頭Invoke-Command
  • 背景工作,從 Start-Job (跨進程工作)
  • 線程作業,透過 Start-ThreadJobForEach-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

另請參閱