Freigeben über


about_Remote_Variables

Kurzbeschreibung

Erläutert, wie lokale und Remotevariablen in Remotebefehlen verwendet werden.

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 werden die Variablen in Remotebefehlen in der Sitzung definiert, in der der Befehl ausgeführt wird. Variablen, die in einer lokalen Sitzung definiert sind, müssen als lokale Variablen im Befehl identifiziert werden.

Verwenden von Remotevariablen

PowerShell geht davon aus, dass die in Remotebefehlen verwendeten Variablen 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 befehl Get-WinEvent ausgeführt wird.

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

Wenn der Befehl in einer beständigen Sitzung ausgeführt wird, PSSession, 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, die Variable muss jedoch 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 $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 aus dem Kontext des Aufrufers auf den Wert der Variablen $var erweitert. Sie erhalten keinen Zugriff auf das Variable-Objekt 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 zur Using: finden Sie unter about_Scopes

Verwenden von Splatting (Aufteilung)

Das PowerShell-Splatting übergibt eine Sammlung von Parameternamen und Werten an einen Befehl. Weitere Informationen finden Sie unter about_Splatting.

In diesem Beispiel ist die Splattingvariable $Splat eine Hashtabelle, die auf dem lokalen Computer eingerichtet ist. Der Invoke-Command stellt eine Verbindung zu einer Remote-Computersitzung her. Der ScriptBlock verwendet den Using: Bereichsmodifizierer mit dem At-Zeichen (@), um die Splattted-Variable darzustellen.

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

Andere Situationen, in denen der Using: Bereichsmodifizierer 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, damit außerhalb des Sitzungscodes darauf zugegriffen werden kann. Der Using: Bereichsmodifizierer wird in den folgenden Kontexten unterstützt:

  • Aus der Ferne ausgeführte Befehle, beginnen mit Invoke-Command mithilfe des Parameters ComputerName, HostName, SSHConnection oder Session (Remotesitzung)
  • Hintergrundaufträge werden mit Start-Job gestartet (nicht aktive 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. Bei Remotesitzungen und nicht aktiven Sitzungen sind sie immer unabhängige Kopien. Bei Threadsitzungen werden sie durch Verweis übergeben.

Serialisierung von Variablenwerten

Fern ausgeführte Befehle und Hintergrundaufgaben laufen außerhalb des Prozesses. 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 eine PSObject-, die die ursprünglichen Objekteigenschaften enthält, jedoch nicht die zugehörigen Methoden.

Bei einer begrenzten Anzahl von Typen konvertiert die Deserialisierung Objekte zurück in den ursprünglichen Typ. Das rehydratisierte Objekt ist eine Kopie der ursprünglichen Objektinstanz. Es verfügt über die Typeigenschaften und -methoden. Bei einfachen Typen wie System.Versionist die Kopie genau. Bei komplexen Typen ist die Kopie unvollkommen. Beispielsweise enthalten rehydratisierte Zertifikatobjekte nicht den privaten Schlüssel.

Instanzen aller anderen Typen sind PSObject Instanzen. Die pstypenames-Eigenschaft enthält den ursprünglichen Typnamen, dem Deserializedvorangestellt ist, z. B. Deserialized.System.Data.DataTable-

Verwendung lokaler Variablen mit ArgumentList Parameter

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

  • Verwenden Sie das Schlüsselwort param, 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 vom Schlüsselwort param definierten Parameter im Befehl.

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

Die folgenden Befehle definieren beispielsweise die $ps Variable in der lokalen Sitzung und verwenden sie dann in einem Remotebefehl. Der Befehl verwendet $Log als Parametername und die lokale Variable, $ps, als Wert.

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

Siehe auch