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 Using
Sie 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
dem Parameter "ComputerName " oder "Session " (Remotesitzung) - Hintergrundaufträge, gestartet mit
Start-Job
(Out-of-Process-Sitzung) - Threadaufträge gestartet über
Start-ThreadJob
(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 $ps
Wert verwendet$log
.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps