Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kurzbeschreibung
Beschreibt, wie eine Verweistypvariable erstellt und verwendet wird.
Lange Beschreibung
Sie können Variablen per Verweis oder Wert an Funktionen übergeben. Wenn Sie eine Variable nach Wert übergeben, übergeben Sie eine Kopie der Daten. Wenn Sie eine Variable übergeben durch Verweis, übergeben Sie einen Verweis auf den ursprünglichen Wert.
Dadurch kann die Funktion den Wert der Variablen ändern, die an sie übergeben wird. Referenztypen werden erstellt mit [ref], der der Typbeschleuniger für die [System.Management.Automation.PSReference] Typus.
Der Hauptzweck der [ref] ist es, die Übergabe von PowerShell-Variablen durch Verweis auf .NET-Methodenparameter zu ermöglichen, die als ref, out, oder in. Sie können auch Ihre eigene PowerShell-Funktion definieren, die [ref] Typ-Parameter. In dieser Verwendung wird [ref] auf eine Variableangewendet, und die resultierende [ref] Instanz kann verwendet werden, um den Wert dieser Variablen indirekt zu ändern.
Im folgenden Beispiel ändert die Funktion den Wert der an sie übergebenen Variablen. In PowerShell sind Ganzzahlen Werttypen, sodass sie als Wert übergeben werden.
Daher ist der Wert von $var außerhalb des Gültigkeitsbereichs der Funktion unverändert.
Function Test($Data)
{
$Data = 3
}
$var = 10
Test -Data $var
$var
10
Im folgenden Beispiel wird eine Variable mit einer Hashtable Funktion übergeben.
Beim Übergeben einer Variablen anhand eines Verweises kann die Funktion die Daten ändern und diese Änderung nach ausführung der Funktion beibehalten werden.
Function Test($Data)
{
$Data.Test = "New Text"
}
$var = @{}
Test -Data $var
$var
Name Value
---- -----
Test New Text
Die Funktion fügt ein neues Schlüssel-Wert-Paar hinzu, das außerhalb des Bereichs der Funktion beibehalten wird.
Schreiben von Funktionen zum Akzeptieren von Referenzparametern
Sie können Ihre Funktionen so codieren, dass ein Parameter als Verweis verwendet wird, unabhängig vom übergebenen Datentyp. Dazu müssen Sie den Parametertyp als [ref]angeben.
Bei Verwendung von Verweisen müssen Sie die Value Eigenschaft des [ref] Typs verwenden, um auf Ihre Daten zuzugreifen.
function Test {
param([ref]$Data)
$Data.Value = 3
}
Um eine Variable an einen Parameter zu übergeben, der einen Verweis erwartet, müssen Sie die Variable als Verweis umwandeln.
Wichtig
Die Klammern und Klammern sind BEIDE erforderlich.
$var = 10
Test -Data ([ref]$var)
$var
3
Übergeben von Verweisen auf .NET-Methoden
Bei einigen .NET-Methoden müssen Sie möglicherweise eine Variable als Verweis übergeben. Wenn die Definition der Methode die Schlüsselwörter in, out, oder ref für einen Parameter verwendet, erwartet sie einen Verweis.
[int] | Get-Member -Static -Name TryParse
Name MemberType Definition
---- ---------- ----------
TryParse Method static bool TryParse(string s, [ref] int result)
Die TryParse Methode versucht, eine Zeichenfolge als ganze Zahl zu analysieren. Wenn die Methode erfolgreich verläuft, wird sie zurückgegeben$true, und das Ergebnis wird in der Variablen gespeichert, die Sie per Verweis übergeben haben.
PS> $number = 0
PS> [int]::TryParse("15", ([ref]$number))
True
PS> $number
15
Verweise und Bereiche
Verweise ermöglichen es, den Wert einer Variablen im übergeordneten Bereich innerhalb eines untergeordneten Bereichs zu ändern.
# Create a value type variable.
$i = 0
# Create a reference type variable.
$iRef = [ref]0
# Invoke a scriptblock to attempt to change both values.
&{$i++;$iRef.Value++}
# Output the results.
"`$i = $i;`$iRef = $($iRef.Value)"
$i = 0;$iRef = 1
Nur die Variable des Verweistyps wurde geändert.
Verwendung [ref] als allgemeiner Objekthalter
Sie können auch Folgendes verwenden [ref] als Allzweck-Objekthalter. In dieser Verwendung wird [ref] auf einen Wert anstelle einer Variablen angewendet. In der Regel ist der Wert eine Instanz eines Werttyps, z. B. eine Zahl. In den meisten Szenarien können Sie stattdessen eine normale Variable oder einen regulären Parameter verwenden. Diese Technik ist jedoch in Szenarien nützlich, in denen die Übergabe eines expliziten Werteträgers unerwünscht (aus Gründen der Kürze) oder nicht möglich ist, wie z. B. bei Skript-Block-Parameterwerten.
Sie können zum Beispiel Skriptblock-Parameterwerte verwenden, um den Wert von NeuerName Parameter des Rename-Item cmdlet. Die Rename-Item können Sie Elemente über die Pipeline an das Cmdlet übergeben. Der Befehl führt den Skriptblock aus, der für jedes Element in der Pipeline an den NewName übergeben wird. Der Scriptblock wird in einem untergeordneten Bereich ausgeführt. Das direkte Ändern einer Variablen im Aufruferbereich hilft nicht, und Sie können in diesem Kontext keine Argumente an den Scriptblock übergeben.
In diesem Beispiel erhöht der scriptblock, der an den NewName-Parameter übergeben wird, den Wert $iRef für jedes Element in der Pipeline. Der Scriptblock erstellt einen neuen Namen, indem am Anfang des Dateinamens eine Zahl hinzugefügt wird.
$iRef = [ref] 0
Get-ChildItem -File $setPath |
Rename-Item -NewName { '{0} - {1}' -f $iRef.Value++,$_.Name }
Unterschied zwischen [ref] und [System.Management.Automation.PSReference]
Eine Variable vom Referenztyp wird mit [ref] Typ Beschleuniger oder durch Angabe des [System.Management.Automation.PSReference] direkt eingeben. Auch wenn [ref] ist ein Schriftbeschleuniger für [System.Management.Automation.PSReference], verhalten sie sich anders.
- Wenn Sie
[ref]um eine Variable zu casten, erstellt PowerShell ein Referenzobjekt, das einen Verweis auf die ursprüngliche Instanz der Variable enthält. - Wenn Sie
[System.Management.Automation.PSReference]zum Umwandeln einer Variablen verwenden, erstellt PowerShell ein Verweisobjekt, das eine Kopie der Variablen enthält, anstatt einen Verweis auf die ursprüngliche Instanz.
Das folgende Skript erstellt beispielsweise eine Variable $x und zwei Referenzobjekte.
PS> $int = 1
PS> $aRef = [ref] $int
PS> $bRef = [System.Management.Automation.PSReference] $int
PS> $int
1
PS> $aRef, $bRef
Value
-----
1
1
An diesem Punkt weisen beide Referenzobjekte denselben Wert wie $intauf. Durch hinzufügen verschiedener Werte zu den Referenzobjekten können wir sehen, dass $aRef, die mit [ref]erstellt wurde, ein Verweis auf die ursprüngliche Instanz von $intist.
$bRef, das mit [System.Management.Automation.PSReference]erstellt wurde, ist eine Kopie der Variablen.
PS> $aRef.Value+=2
PS> $bRef.Value+=5
PS> $int
3
PS> $aRef, $bRef
Value
-----
3
6