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 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 Get-WinEvent Befehl ausgeführt wird.

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

Wenn der Befehl in einer persistenten Sitzung 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, 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 lautet Using 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 sich 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 Variablerverweis, z $using:var . B. wird aus dem Kontext des Aufrufers auf den Wert der Variablen $var erweitert. Sie erhalten keinen Zugriff auf das Variable-Objekt des Aufrufers. Der Bereichsmodifizierer Using 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 finden UsingSie unter about_Scopes

Verwenden von Splatting

Die 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 eine Hashtabelle, $Splat die auf dem lokalen Computer eingerichtet ist. Die Invoke-Command Verbindung mit einer Remotecomputersitzung wird hergestellt. 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 "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:

  • Remote ausgeführte Befehle, gestartet mit Invoke-Command der Verwendung der Parameter "ComputerName", "HostName", "SSHConnection" oder "Session" (Remotesitzung)
  • 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 sind sie immer unabhängige Kopien. In Threadsitzungen werden sie per Verweis übergeben.

Serialisierung von Variablenwerten

Remote ausgeführte Befehle und Hintergrundaufträge laufen außerhalb des Prozesses aus. 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 enthält, aber nicht seine Methoden.

Bei einem begrenzten Satz von Typen rehydratisiert die Deserialisierung Objekte zurück zum ursprünglichen Typ. Das rehydratisierte Objekt ist eine Kopie der ursprünglichen Objektinstanz. Es verfügt über die Typeigenschaften und -methoden. Bei einfachen Typen, z . B. System.Version, ist 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 mit dem Präfix Deserialized, z. B. Deserialized.System.Data.DataTable

Verwenden lokaler Variablen mit 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 das param Schlüsselwort, 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 durch das param Schlüsselwort im Befehl definierten Parameter.

  • 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 wird als Parametername und die lokale Variable als $psWert verwendet$log.

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

Siehe auch