about_Ref

Kurzbeschreibung

Beschreibt, wie eine Verweistypvariable erstellt und verwendet wird.

Lange Beschreibung

Sie können Variablen an Funktionen übergeben, indem Sie auf oder nach Wertverweisen. Wenn Sie eine Variable nach Wertübergeben, übergeben Sie eine Kopie der Daten. Wenn Sie eine Variable durch Verweisübergeben, ü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 mit [ref]erstellt. Dabei handelt es sich um die Typinfo für den [System.Management.Automation.PSReference] Typ.

Der Hauptzweck von [ref] ist das Übergeben von PowerShell-Variablen durch Verweis auf .NET-Methodenparameter, die als ref, outoder ingekennzeichnet sind. Sie können auch Ihre eigene PowerShell-Funktion definieren, die [ref] Typparameter verwendet. 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 ganze Zahlen Werttypen, sodass sie nach 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, die eine Hashtable enthält, an eine Funktion übergeben. Hashtable ist ein Objekttyp, sodass er standardmäßig per Verweis an die Funktionübergeben wird.

Beim Übergeben einer Variablen durch Verweiskann 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, outoder 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 $truezurückgegeben, und das Ergebnis wird in der Variablen gespeichert, die Sie durch 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 [ref] als allgemeinen Objekthalter verwenden. 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 hilfreich, in denen das Übergeben eines expliziten Werthalters (aus Platzgründen) oder nicht möglich ist, z. B. in Skriptblock-Parameterwerten.

Sie können beispielsweise Skriptblockparameterwerte verwenden, um den Wert von NewName Parameter des Cmdlets Rename-Item zu berechnen. Mit dem Cmdlet Rename-Item können Sie Elemente an das Cmdlet weiterleiten. 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 Verweistypvariable wird mithilfe der [ref] Typbeschleuniger oder durch direkte Angabe des [System.Management.Automation.PSReference] Typs erstellt. Obwohl [ref] ein Typbeschleuniger für [System.Management.Automation.PSReference]ist, verhalten sie sich anders.

  • Wenn Sie [ref] zum Umwandeln einer Variablen verwenden, erstellt PowerShell ein Verweisobjekt, das einen Verweis auf die ursprüngliche Instanz der Variablen 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

Siehe auch