Freigeben über


about_Remote_Variables

Kurze Beschreibung

Erläutert die Verwendung von lokalen und Remotevariablen in Remotebefehlen.

Lange Beschreibung

Sie können Variablen in Befehlen verwenden, die Sie auf Remotecomputern ausführen. Weisen Sie der Variablen einen Wert zu, und verwenden Sie dann die Variable anstelle des Werts.

Standardmäßig wird davon ausgegangen, dass die Variablen in Remotebefehlen in der Sitzung definiert werden, die den Befehl ausführt. Variablen, die in einer lokalen Sitzung definiert sind, müssen im Befehl als lokale Variablen identifiziert werden.

Verwenden von Remotevariablen

PowerShell geht davon aus, dass die variablen, die in Remotebefehlen verwendet werden, in der Sitzung definiert sind, in der der Befehl ausgeführt wird.

In diesem Beispiel wird die $ps Variable in der temporären Sitzung definiert, in der der Get-WinEvent Befehl ausgeführt wird.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

Wenn der Befehl in einer persistenten Sitzung, PSSession, ausgeführt wird, muss die Remotevariable in dieser Sitzung definiert werden.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Verwenden lokaler Variablen

Sie können lokale Variablen in Remotebefehlen verwenden, aber die Variable muss in der lokalen Sitzung definiert werden.

Ab PowerShell 3.0 können Sie den Using Bereichsmodifizierer verwenden, um eine lokale Variable in einem Remotebefehl zu identifizieren.

Die Syntax von Using lautet wie folgt:

$Using:<VariableName>

Im folgenden Beispiel wird die $ps Variable in der lokalen Sitzung erstellt, aber in der Sitzung verwendet, in der der Befehl ausgeführt wird. Der Using Bereichsmodifizierer identifiziert sich $ps als lokale Variable.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Der Using Bereichsmodifizierer kann in einer PSSession verwendet werden.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

Ein Variablenverweis wie $using:var wird zum Wert der Variablen $var aus dem Kontext des Aufrufers erweitert. Sie erhalten keinen Zugriff auf das Variablenobjekt des Aufrufers. Der Using Bereichsmodifizierer kann nicht verwendet werden, um eine lokale Variable innerhalb der PSSession zu ändern. Der folgende Code funktioniert beispielsweise nicht:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

Weitere Informationen zu Usingfinden Sie unter about_Scopes

Verwenden von Splatting

PowerShell-Splatting übergibt eine Auflistung von Parameternamen und -werten an einen Befehl. Weitere Informationen finden Sie unter about_Splatting.

In diesem Beispiel ist die Splattingvariable eine Hashtabelle, $Splat die auf dem lokalen Computer eingerichtet ist. Stellt Invoke-Command eine Verbindung mit einer Remotecomputersitzung her. Der ScriptBlock verwendet den Using Bereichsmodifizierer mit dem At (@)-Symbol, um die Splatted-Variable darzustellen.

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

Andere Situationen, in denen der Bereichsmodifizierer "Using" erforderlich ist

Für alle Skripts oder Befehle, die außerhalb der Sitzung ausgeführt werden, benötigen Sie den Using Bereichsmodifizierer, um Variablenwerte aus dem aufrufenden Sitzungsbereich einzubetten, sodass aus Sitzungscode darauf zugegriffen werden kann. Der Using Bereichsmodifizierer wird in den folgenden Kontexten unterstützt:

  • Remote ausgeführte Befehle, die mit Invoke-Command der Verwendung der Parameter ComputerName, HostName, SSHConnection oder Session (Remotesitzung) gestartet wurden
  • Hintergrundaufträge, gestartet mit Start-Job (Out-of-Process-Sitzung)
  • Threadaufträge, gestartet über Start-ThreadJob oder ForEach-Object -Parallel (separate Threadsitzung)

Abhängig vom Kontext sind eingebettete Variablenwerte entweder unabhängige Kopien der Daten im Bereich des Aufrufers oder Verweise darauf. In Remote- und Out-of-Process-Sitzungen handelt es sich immer um unabhängige Kopien. In Threadsitzungen werden sie als Verweis übergeben.

Serialisierung von Variablenwerten

Remote ausgeführte Befehle und Hintergrundaufträge werden aus dem Prozess heraus ausgeführt. Out-of-Process-Sitzungen verwenden XML-basierte Serialisierung und Deserialisierung, um die Werte von Variablen über die Prozessgrenzen hinweg verfügbar zu machen. Der Serialisierungsprozess konvertiert Objekte in ein PSObject , das die ursprünglichen Objekteigenschaften, aber nicht die Methoden enthält.

Für einen begrenzten Satz von Typen rehydriert die Deserialisierung Objekte zurück zum ursprünglichen Typ. Das rehydrierte Objekt ist eine Kopie des ursprünglichen Objekts instance. Es verfügt über die Typeigenschaften und -methoden. Bei einfachen Typen, z . B. System.Version, ist die Kopie exakt. Bei komplexen Typen ist die Kopie unvollkommen. Beispielsweise enthalten rehydrierte Zertifikatobjekte den privaten Schlüssel nicht.

Instanzen aller anderen Typen sind PSObject-Instanzen . Die PSTypeNames-Eigenschaft enthält den ursprünglichen Typnamen mit dem Präfix Deserialized, z . B. Deserialized.System.Data.DataTable

Verwenden lokaler Variablen mit dem ArgumentList-Parameter

Sie können lokale Variablen in einem Remotebefehl verwenden, indem Sie Parameter für den Remotebefehl definieren und den ArgumentList-Parameter des Invoke-Command Cmdlets verwenden, um die lokale Variable als Parameterwert anzugeben.

  • Verwenden Sie die param Schlüsselwort (keyword), um Parameter für den Remotebefehl zu definieren. Die Parameternamen sind Platzhalter, die nicht mit dem Namen der lokalen Variablen übereinstimmen müssen.

  • Verwenden Sie die parameter, die param vom Schlüsselwort (keyword) im Befehl definiert sind.

  • Verwenden Sie den ArgumentList-Parameter des Invoke-Command Cmdlets, um die lokale Variable als Parameterwert anzugeben.

Beispielsweise definieren die folgenden Befehle die $ps Variable in der lokalen Sitzung und verwenden sie dann in einem Remotebefehl. Der Befehl verwendet $log als Parameternamen und die lokale Variable , $psals Wert.

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

Weitere Informationen