about_Automatic_Variables

Kurze Beschreibung

Beschreibt Variablen, die Statusinformationen für PowerShell speichern. Diese Variablen werden von PowerShell erstellt und verwaltet.

Lange Beschreibung

Konzeptioneller Weise werden diese Variablen als schreibgeschützt betrachtet. Obwohl sie geschrieben werden können , sollte die Abwärtskompatibilität nicht geschrieben werden.

Nachfolgend sehen Sie eine Liste der automatischen Variablen in PowerShell:

$$

Enthält das letzte Token in der letzten Zeile, die von der Sitzung empfangen wird.

$?

Enthält den Ausführungsstatus des letzten Befehls. Es enthält True , wenn der letzte Befehl erfolgreich war und False , wenn es fehlgeschlagen ist.

Für Cmdlets und erweiterte Funktionen, die in mehreren Phasen in einer Pipeline ausgeführt werden, z. B. in beiden processend Und Blöcken, aufrufen this.WriteError() oder $PSCmdlet.WriteError() jeweils auf False festgelegt$?, wie this.ThrowTerminatingError() und $PSCmdlet.ThrowTerminatingError().

Das Write-Error Cmdlet legt immer sofort nach der Ausführung auf "False" fest, wird jedoch für eine Funktion, die sie aufruft, nicht auf "False" festgelegt $?$?:

function Test-WriteError
{
    Write-Error "Bad"
    $? # $false
}

Test-WriteError
$? # $true

Für den letzten Zweck $PSCmdlet.WriteError() sollte stattdessen verwendet werden.

Bei systemeigenen Befehlen (ausführbare Befehle) $? wird "True" festgelegt, wenn 0 ist und auf "False" festgelegt ist, wenn $LASTEXITCODE$LASTEXITCODE es sich um einen anderen Wert handelt.

Hinweis

Bis PowerShell 7, die eine Anweisung in Klammern (...)enthält, Subexpressionsyntax $(...) oder Arrayausdruck @(...) immer auf True zurücksetzen, sodass (Write-Error)"True" angezeigt $? wird.$? Dies wurde in PowerShell 7 geändert, sodass $? immer der tatsächliche Erfolg des letzten Befehls in diesen Ausdrücken widergibt.

$^

Enthält das erste Token in der letzten Zeile, die von der Sitzung empfangen wird.

$_

Wie in $PSItem. Enthält das aktuelle Objekt im Pipelineobjekt. Sie können diese Variable in Befehlen verwenden, die eine Aktion für jedes Objekt oder für ausgewählte Objekte in einer Pipeline ausführen.

$args

Enthält ein Array von Werten für nicht deklarierte Parameter, die an eine Funktion, ein Skript oder einen Skriptblock übergeben werden. Wenn Sie eine Funktion erstellen, können Sie die Parameter mit dem param Schlüsselwort deklarieren oder eine durch Komma getrennte Liste von Parametern in Klammern nach dem Funktionsnamen hinzufügen.

In einer Ereignisaktion enthält die $args Variable Objekte, die die Ereignisargumente des Ereignisses darstellen, das verarbeitet wird. Diese Variable wird nur innerhalb des Action Blocks eines Ereignisregistrierungsbefehls gefüllt. Der Wert dieser Variable kann auch in der SourceArgs-Eigenschaft des PSEventArgs-Objekts gefunden werden, das Get-Event zurückgegeben wird.

$ConsoleFileName

Enthält den Pfad der Konsolendatei (.psc1), die zuletzt in der Sitzung verwendet wurde. Diese Variable wird ausgefüllt, wenn Sie PowerShell mit dem Export-ConsolePSConsoleFile-Parameter starten oder das Cmdlet zum Exportieren von Snap-In-Namen in eine Konsolendatei verwenden.

Wenn Sie das Export-Console Cmdlet ohne Parameter verwenden, aktualisiert sie automatisch die Konsolendatei, die zuletzt in der Sitzung verwendet wurde. Sie können diese automatische Variable verwenden, um die zu aktualisierende Datei zu bestimmen.

$Error

Enthält ein Array von Fehlerobjekten, die die neuesten Fehler darstellen. Der neueste Fehler ist das erste Fehlerobjekt im Array $Error[0].

Um zu verhindern, dass ein Fehler dem $Error Array hinzugefügt wird, verwenden Sie den allgemeinen Parameter ErrorAction mit dem Wert " Ignorieren". Weitere Informationen findest du unter about_CommonParameters.

$Event

Enthält ein PSEventArgs-Objekt , das das ereignis darstellt, das verarbeitet wird. Diese Variable wird nur innerhalb des Action Blocks eines Ereignisregistrierungsbefehls wie z Register-ObjectEvent. B. aufgefüllt. Der Wert dieser Variable ist dasselbe Objekt, das das Get-Event Cmdlet zurückgibt. Sie können die Eigenschaften der Event Variable verwenden, z $Event.TimeGenerated. B. in einem Action Skriptblock.

$EventArgs

Enthält ein Objekt, das das erste Ereignisargument darstellt, das von EventArgs des Ereignisses abgeleitet wird, das verarbeitet wird. Diese Variable wird nur innerhalb des Action Blocks eines Ereignisregistrierungsbefehls gefüllt. Der Wert dieser Variable kann auch in der SourceEventArgs-Eigenschaft des PSEventArgs-Objekts gefunden werden, das Get-Event zurückgegeben wird.

$EventSubscriber

Enthält ein PSEventSubscriber-Objekt , das den Ereignisabonnent des Ereignisses darstellt, das verarbeitet wird. Diese Variable wird nur innerhalb des Action Blocks eines Ereignisregistrierungsbefehls gefüllt. Der Wert dieser Variable ist dasselbe Objekt, das das Get-EventSubscriber Cmdlet zurückgibt.

$ExecutionContext

Enthält ein EngineIntrinsics-Objekt , das den Ausführungskontext des PowerShell-Hosts darstellt. Sie können diese Variable verwenden, um die Ausführungsobjekte zu finden, die für Cmdlets verfügbar sind.

$false

Enthält "False". Sie können diese Variable verwenden, um False in Befehlen und Skripts darzustellen, anstatt die Zeichenfolge "false"zu verwenden. Die Zeichenfolge kann als True interpretiert werden, wenn sie in eine nicht leere Zeichenfolge oder in eine nicht null ganze Zahl konvertiert wird.

$foreach

Enthält den Aufzählungsator (nicht die resultierenden Werte) einer ForEach-Schleife . Die $ForEach Variable ist nur vorhanden, während die Schleife ausgeführt wird. Es wird gelöscht, nachdem die ForEach Schleife abgeschlossen wurde.

Aufzählungen enthalten Eigenschaften und Methoden, mit denen Sie Schleifenwerte abrufen und die aktuelle Schleifen-Iteration ändern können. Weitere Informationen finden Sie unter Verwenden von Aufzählungen.

$HOME

Enthält den vollständigen Pfad des Startverzeichniss des Benutzers. Diese Variable entspricht den Windows-Umgebungsvariablen in der "$env:homedrive$env:homepath" Regel C:\Users\<UserName>.

$Host

Enthält ein Objekt, das die aktuelle Hostanwendung für PowerShell darstellt. Sie können diese Variable verwenden, um den aktuellen Host in Befehlen darzustellen oder die Eigenschaften des Hosts anzuzeigen oder zu ändern, z$Host.version. B. oder $Host.CurrentCulture$host.UI.RawUI.SetBackGroundColor("Red").

$input

Enthält einen Aufzählungsator, der alle Eingaben aufzählt, die an eine Funktion übergeben werden. Die $input Variable ist nur für Funktionen und Skriptblöcke verfügbar (die nicht benannte Funktionen sind).

  • In einer Funktion ohne begin, processoder end Block wird die $input Variable die Auflistung aller Eingaben an die Funktion aufzählen.

  • begin Im Block enthält die $input Variable keine Daten.

  • process Im Block enthält die $input Variable das Objekt, das sich derzeit in der Pipeline befindet.

  • end Im Block wird die $input Variable die Auflistung aller Eingaben an die Funktion aufgezählt.

    Hinweis

    Sie können die $input Variable nicht innerhalb des process Blocks und des end Blockes in derselben Funktion oder skriptblock verwenden.

Da $input es sich um eine Aufzählung handelt, kann der Zugriff auf eine der Eigenschaften $input nicht mehr verfügbar sein. Sie können in einer anderen Variable speichern $input , um die $input Eigenschaften wiederzuverwenden.

Aufzählungen enthalten Eigenschaften und Methoden, mit denen Sie Schleifenwerte abrufen und die aktuelle Schleifen-Iteration ändern können. Weitere Informationen finden Sie unter Verwenden von Aufzählungen.

Die $input Variable ist auch für den vom Parameter angegebenen Befehl pwsh verfügbar, der von der -Command Befehlszeile aufgerufen wird. Im folgenden Beispiel wird die Windows-Befehlsshell ausgeführt.

echo Hello | pwsh -Command """$input World!"""

$IsCoreCLR

Enthält $True , wenn die aktuelle Sitzung auf der .NET Core Runtime (CoreCLR) ausgeführt wird. Andernfalls enthält $False.

$IsLinux

Enthält $True , wenn die aktuelle Sitzung auf einem Linux-Betriebssystem ausgeführt wird. Andernfalls enthält $False.

$IsMacOS

Enthält $True , wenn die aktuelle Sitzung auf einem MacOS-Betriebssystem ausgeführt wird. Andernfalls enthält $False.

$IsWindows

Enthält $TRUE , wenn die aktuelle Sitzung auf einem Windows-Betriebssystem ausgeführt wird. Andernfalls enthält $FALSE.

$LASTEXITCODE

Enthält den Exitcode des letzten nativen Programms oder PowerShell-Skripts, das ausgeführt wurde.

Für PowerShell-Skripts hängt der Wert $LASTEXITCODE davon ab, wie das Skript aufgerufen wurde und ob das exit Schlüsselwort verwendet wurde:

  • Wenn ein Skript das exit Schlüsselwort verwendet, wird auf den angegebenen Wert festgelegt, $LASTEXITCODE unabhängig davon, wie das Skript aufgerufen wurde. Weitere Informationen finden Sie unter about_Language_Keywords.
  • Wenn ein Skript direkt aufgerufen wird, z ./Test.ps1. B. oder mit dem Anrufoperator (&) wie & ./Test.ps1, wird der Wert nicht $LASTEXITCODE geändert.
  • Wenn ein Skript mit pwsh und dem Dateiparameter aufgerufen wird, wird der Wert $LASTEXITCODE festgelegt 1 , wenn das Skript aufgrund einer ausgelösten Ausnahme beendet wurde und 0 andernfalls.

$Matches

Die $Matches Variable funktioniert mit den und -notmatch Operatoren-match. Wenn Sie Skalareingaben an den oder -notmatch den -match Operator übermitteln und entweder eine Übereinstimmung erkennt, geben sie einen booleschen Wert zurück und füllen die $Matches automatische Variable mit einer Hashtabelle aller Zeichenfolgenwerte, die übereinstimmen. Die $Matches Hashtabelle kann auch mit Aufzeichnungen gefüllt werden, wenn Sie reguläre Ausdrücke mit dem -match Operator verwenden.

Weitere Informationen zum -match Operator finden Sie unter about_Comparison_Operators. Weitere Informationen zu regulären Ausdrücken finden Sie unter about_Regular_Expressions.

Die $Matches Variable funktioniert auch in einer switch Anweisung mit dem -Regex Parameter. Es wird auf dieselbe Weise wie die und -notmatch die -match Operatoren gefüllt. Weitere Informationen zur switch Anweisung finden Sie unter about_Switch.

Hinweis

Wenn $Matches sie in einer Sitzung ausgefüllt wird, behält sie den übereinstimmend wert, bis er von einer anderen Übereinstimmung überschrieben wird. Wenn -match sie erneut verwendet wird und keine Übereinstimmung gefunden wird, wird sie nicht zurückgesetzt$Matches.$null Der zuvor übereinstimmene Wert wird beibehalten $Matches , bis eine andere Übereinstimmung gefunden wird.

$MyInvocation

Enthält Informationen über den aktuellen Befehl, z. B. den Namen, Parameterwerte und Informationen zum Starten, Aufrufen oder Aufrufen des Befehls, z. B. den Namen des Skripts, das den aktuellen Befehl aufgerufen hat.

$MyInvocation wird nur für Skripts, Funktion und Skriptblöcke ausgefüllt. Sie können die Informationen im System.Management.Automation.InvocationInfo-Objekt verwenden, das $MyInvocation im aktuellen Skript zurückgibt, z. B. den Pfad und den Dateinamen des Skripts () oder den Namen einer Funktion ($MyInvocation.MyCommand.Path$MyInvocation.MyCommand.Name) zum Identifizieren des aktuellen Befehls. Dies ist nützlich, um den Namen des aktuellen Skripts zu finden.

Ab PowerShell 3.0 MyInvocation verfügt über die folgenden neuen Eigenschaften.

  • PSScriptRoot – Enthält den vollständigen Pfad zum Skript, das den aktuellen Befehl aufgerufen hat. Der Wert dieser Eigenschaft wird nur ausgefüllt, wenn der Aufrufer ein Skript ist.
  • PSCommandPath – Enthält den vollständigen Pfad und dateinamen des Skripts, das den aktuellen Befehl aufgerufen hat. Der Wert dieser Eigenschaft wird nur ausgefüllt, wenn der Aufrufer ein Skript ist.

Im Gegensatz zu den $PSScriptRoot und $PSCommandPath automatischen Variablen enthalten die EIGENSCHAFTEN PSScriptRoot und PSCommandPath der $MyInvocation automatischen Variable Informationen zum Aufrufer oder aufrufenden Skript, nicht das aktuelle Skript.

$NestedPromptLevel

Enthält die aktuelle Eingabeaufforderungsebene. Ein Wert von 0 gibt die ursprüngliche Eingabeaufforderungsebene an. Der Wert wird erhöht, wenn Sie eine geschachtelte Ebene eingeben und beim Beenden deaktiviert werden.

PowerShell stellt beispielsweise eine geschachtelte Eingabeaufforderung dar, wenn Sie die $Host.EnterNestedPrompt Methode verwenden. PowerShell stellt außerdem eine geschachtelte Eingabeaufforderung dar, wenn Sie einen Haltepunkt im PowerShell-Debugger erreichen.

Wenn Sie eine geschachtelte Eingabeaufforderung eingeben, hält PowerShell den aktuellen Befehl an, speichert den Ausführungskontext und erhöht den Wert der $NestedPromptLevel Variable. Um zusätzliche geschachtelte Eingabeaufforderungen (bis zu 128 Ebenen) zu erstellen oder zur ursprünglichen Eingabeaufforderung zurückzukehren, führen Sie den Befehl oder den Typ aus exit.

Die Variable hilft Ihnen beim Nachverfolgen $NestedPromptLevel der Eingabeaufforderungsebene. Sie können eine alternative PowerShell-Eingabeaufforderung erstellen, die diesen Wert enthält, sodass sie immer sichtbar ist.

$null

$null ist eine automatische Variable, die einen Null - oder leeren Wert enthält. Sie können diese Variable verwenden, um einen fehlenden oder nicht definierten Wert in Befehlen und Skripts darzustellen.

PowerShell behandelt $null ein Objekt mit einem Wert, also als expliziter Platzhalter, damit Sie einen leeren Wert in einer Reihe von Werten darstellen können $null .

Wenn Sie beispielsweise $null in einer Auflistung enthalten sind, wird sie als eine der Objekte gezählt.

$a = "one", $null, "three"
$a.count
3

Wenn Sie die $null Variable an das ForEach-Object Cmdlet weiterleiten, generiert sie einen Wert für $null, genauso wie für die anderen Objekte

"one", $null, "three" | ForEach-Object { "Hello " + $_}
Hello one
Hello
Hello three

Daher können Sie keinen $nullParameterwert bedeuten. Ein Parameterwert der Außerkraftsetzung des $null Standardwerts.

Da PowerShell die $null Variable jedoch als Platzhalter behandelt, können Sie sie in Skripts wie dem folgenden verwenden, was nicht funktioniert, wenn $null sie ignoriert wurden.

$calendar = @($null, $null, "Meeting", $null, $null, "Team Lunch", $null)
$days = "Sunday","Monday","Tuesday","Wednesday","Thursday",
        "Friday","Saturday"
$currentDay = 0
foreach($day in $calendar)
{
    if($day -ne $null)
    {
        "Appointment on $($days[$currentDay]): $day"
    }

    $currentDay++
}
Appointment on Tuesday: Meeting
Appointment on Friday: Team lunch

$PID

Enthält den Prozessbezeichner (PID) des Prozesses, der die aktuelle PowerShell-Sitzung hostt.

$PROFILE

Enthält den vollständigen Pfad des PowerShell-Profils für den aktuellen Benutzer und die aktuelle Hostanwendung. Sie können diese Variable verwenden, um das Profil in Befehlen darzustellen. Sie können es beispielsweise in einem Befehl verwenden, um zu ermitteln, ob ein Profil erstellt wurde:

Test-Path $PROFILE

Sie können es auch in einem Befehl verwenden, um ein Profil zu erstellen:

New-Item -ItemType file -Path $PROFILE -Force

Sie können es in einem Befehl verwenden, um das Profil in notepad.exezu öffnen:

notepad.exe $PROFILE

$PSBoundParameters

Enthält ein Wörterbuch der Parameter, die an ein Skript oder eine Funktion und ihre aktuellen Werte übergeben werden. Diese Variable hat nur einen Wert in einem Bereich, in dem Parameter deklariert werden, z. B. ein Skript oder eine Funktion. Sie können es verwenden, um die aktuellen Werte von Parametern anzuzeigen oder zu ändern oder Parameterwerte an ein anderes Skript oder eine andere Funktion zu übergeben.

In diesem Beispiel übergibt die Funktion "Test2 " die $PSBoundParameters Funktion "Test1" . Die $PSBoundParameters werden im Format von Schlüssel und Wert angezeigt.

function Test1 {
   param($a, $b)

   # Display the parameters in dictionary format.
   $PSBoundParameters
}

function Test2 {
   param($a, $b)

   # Run the Test1 function with $a and $b.
   Test1 @PSBoundParameters
}
Test2 -a Power -b Shell
Key   Value
---   -----
a     Power
b     Shell

$PSCmdlet

Enthält ein Objekt, das das Cmdlet oder die erweiterte Funktion darstellt, die ausgeführt wird.

Sie können die Eigenschaften und Methoden des Objekts in Ihrem Cmdlet oder Funktionscode verwenden, um auf die Bedingungen der Verwendung zu reagieren. Die ParameterSetName-Eigenschaft enthält beispielsweise den Namen des Parametersatzes, der verwendet wird, und die ShouldProcess-Methode fügt dem Cmdlet dynamisch die Parameter "WhatIf " und " Bestätigen " hinzu.

Weitere Informationen zur $PSCmdlet automatischen Variable finden Sie unter about_Functions_CmdletBindingAttribute und about_Functions_Advanced.

$PSCommandPath

Enthält den vollständigen Pfad und den Dateinamen des Skripts, das ausgeführt wird. Diese Variable ist in allen Skripts gültig.

$PSCulture

Ab PowerShell 7 spiegelt $PSCulture die Kultur des aktuellen PowerShell-Runspace (Sitzung) wider. Wenn die Kultur in einem PowerShell-Runspace geändert wird, wird der $PSCulture Wert für diesen Runspace aktualisiert.

Die Kultur bestimmt das Anzeigeformat von Elementen wie Zahlen, Währungen und Datumsangaben und wird in einem System.Globalization.CultureInfo-Objekt gespeichert. Verwenden Sie Get-Culture zum Anzeigen der Kultur des Computers. $PSCulture enthält den Wert der Name-Eigenschaft .

$PSDebugContext

Während des Debuggens enthält diese Variable Informationen zur Debugumgebung. Andernfalls enthält er einen NULL-Wert . Daher können Sie es verwenden, um zu bestimmen, ob der Debugger über Kontrolle verfügt. Beim Auffüllen enthält es ein PsDebugContext-Objekt , das Haltepunkte und InvocationInfo-Eigenschaften aufweist. Die InvocationInfo-Eigenschaft verfügt über mehrere nützliche Eigenschaften, einschließlich der Location-Eigenschaft . Die Location-Eigenschaft gibt den Pfad des Skripts an, das debuggiert wird.

$PSHOME

Enthält den vollständigen Pfad des Installationsverzeichniss für PowerShell in der Regel $env:windir\System32\PowerShell\v1.0 in Windows-Systemen. Sie können diese Variable in den Pfaden von PowerShell-Dateien verwenden. Beispielsweise durchsucht der folgende Befehl die konzeptionellen Hilfethemen für die Wortvariable:

Select-String -Pattern Variable -Path $pshome\*.txt

$PSItem

Wie in $_. Enthält das aktuelle Objekt im Pipelineobjekt. Sie können diese Variable in Befehlen verwenden, die eine Aktion für jedes Objekt oder für ausgewählte Objekte in einer Pipeline ausführen.

$PSScriptRoot

Enthält den vollständigen Pfad des übergeordneten Verzeichniss des ausführenden Skripts.

In PowerShell 2.0 ist diese Variable nur in Skriptmodulen gültig (.psm1). Ab PowerShell 3.0 ist es in allen Skripts gültig.

$PSSenderInfo

Enthält Informationen über den Benutzer, der die PSSession gestartet hat, einschließlich der Benutzeridentität und der Zeitzone des ursprünglichen Computers. Diese Variable ist nur in PSSessions verfügbar.

Die $PSSenderInfo Variable enthält eine benutzerdefinierte Eigenschaft, ApplicationArguments, die standardmäßig nur die $PSVersionTable von der ursprünglichen Sitzung enthält. Verwenden Sie den ApplicationArguments-Parameter des New-PSSessionOption Cmdlets, um der ApplicationArguments-Eigenschaft Daten hinzuzufügen.

$PSUICulture

Enthält den Namen der Benutzeroberflächenkultur (UI), die derzeit im Betriebssystem verwendet wird. Die Benutzeroberflächenkultur bestimmt, welche Textzeichenfolgen für die Benutzeroberflächenelemente, z. B. Menüs und Meldungen, verwendet werden. Dies ist der Wert des Systems.Globalization.CultureInfo.Current UICulture.Name Eigenschaft des Systems. Um das System.Globalization.CultureInfo-Objekt für das System abzurufen, verwenden Sie das Get-UICulture Cmdlet.

$PSVersionTable

Enthält eine schreibgeschützte Hashtabelle, die Details zur Version von PowerShell anzeigt, die in der aktuellen Sitzung ausgeführt wird. Die Tabelle enthält die folgenden Elemente:

  • PSVersion – Die PowerShell-Versionsnummer
  • PSEdition Diese Eigenschaft hat den Wert von "Desktop" für PowerShell 4 und unten sowie PowerShell 5.1 für voll funktionsfähige Windows-Editionen. Diese Eigenschaft hat den Wert Core für PowerShell 6 und höher sowie Windows PowerShell 5.1 auf Editionen mit eingeschränkter Größe wie Windows Nano Server oder Windows IoT.
  • GitCommitId – Die Commit-ID der Quelldateien in GitHub,
  • Betriebssystem – Beschreibung des Betriebssystems, auf dem PowerShell ausgeführt wird.
  • Plattform – Plattform , auf der das Betriebssystem ausgeführt wird. Der Wert für Linux und macOS ist Unix. Prüfen Sie $IsMacOs und $IsLinux.
  • PSCompatibleVersions – Versionen von PowerShell, die mit der aktuellen Version kompatibel sind
  • PSRemotingProtocolVersion – Die Version des PowerShell-Remoteverwaltungsprotokolls.
  • SerializationVersion – Die Version der Serialisierungsmethode
  • WSManStackVersion – Die Versionsnummer des WS-Management Stapels

$PWD

Enthält ein Pfadobjekt, das den vollständigen Pfad des aktuellen Verzeichnisspeicherorts für den aktuellen PowerShell-Runspace darstellt.

Hinweis

PowerShell unterstützt mehrere Runspaces pro Prozess. Jeder Runspace verfügt über ein eigenes aktuelles Verzeichnis. Dies entspricht nicht dem aktuellen Verzeichnis des Prozesses: [System.Environment]::CurrentDirectory.

$Sender

Enthält das Objekt, das dieses Ereignis generiert hat. Diese Variable wird nur innerhalb des Aktionsblocks eines Ereignisregistrierungsbefehls ausgefüllt. Der Wert dieser Variablen kann auch in der Sender-Eigenschaft des zurückgegebenen PSEventArgs-ObjektsGet-Event gefunden werden.

$ShellId

Enthält den Bezeichner der aktuellen Shell.

$StackTrace

Enthält eine Stapelablaufverfolgung für den letzten Fehler.

$switch

Enthält den Aufzählungsator nicht die resultierenden Werte einer Switch Anweisung. Die $switch Variable ist nur vorhanden, während die Switch Anweisung ausgeführt wird. Sie wird gelöscht, wenn die Anweisung die switch Ausführung abgeschlossen hat. Weitere Informationen finden Sie unter about_Switch.

Aufzählungen enthalten Eigenschaften und Methoden, mit denen Sie Schleifenwerte abrufen und die aktuelle Loop-Iteration ändern können. Weitere Informationen finden Sie unter Verwenden von Aufzählungen.

$this

Die $this Variable wird in Skriptblöcken verwendet, die Klassen erweitern, um auf die Instanz der Klasse selbst zu verweisen.

Das Extensible Type System (ETS) von PowerShell ermöglicht es Ihnen, Klassen mithilfe von Skriptblöcken Eigenschaften hinzuzufügen. In einem Skriptblock, der eine Skripteigenschaft oder eine Skriptmethode definiert, bezieht sich die $this Variable auf eine Instanz des Objekts der Klasse, die erweitert wird. Beispielsweise verwendet PowerShell ETS, um der FileInfo-Klasse die BaseName-Eigenschaft hinzuzufügen.

PS> Get-ChildItem .\README.md | Get-Member BaseName | Format-List

TypeName   : System.IO.FileInfo
Name       : BaseName
MemberType : ScriptProperty
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt 0)
             {$this.Name.Remove($this.Name.Length - $this.Extension.Length
             )}else{$this.Name};}

Weitere Informationen finden Sie unter about_Types.ps1xml.

In einer PowerShell-Klasse bezieht sich die $this Variable auf das Instanzobjekt der Klasse selbst und ermöglicht den Zugriff auf Eigenschaften und Methoden, die in der Klasse definiert sind. Weitere Informationen finden Sie unter about_Classes.

Die $this Variable wird auch von .NET-Ereignisklassen verwendet, die Skriptblöcke als Stellvertretungen für den Ereignishandler übernehmen. In diesem Szenario stellt das Objekt dar, $this das das Ereignis stammt, das als Ereignissender bezeichnet wird.

$True

Enthält "True". Sie können diese Variable verwenden, um "True" in Befehlen und Skripts darzustellen.

Verwenden von Aufzählungszeichen

Die $input, $foreachund $switch Variablen sind alle Aufzählungszeichen, die zum Durchlaufen der werte verwendet werden, die von ihrem enthaltenden Codeblock verarbeitet werden.

Ein Aufzählungsator enthält Eigenschaften und Methoden, mit deren Hilfe Sie Iterationswerte voranstellen oder zurücksetzen oder Iterationswerte abrufen können. Direktes Bearbeiten von Enumerationen wird nicht als bewährte Methode betrachtet.

  • Innerhalb von Schleifen sollten Ablaufsteuerungsstichwörter umgebrochen und fortgesetzt werden.

  • Innerhalb von Funktionen, die Pipelineeingaben akzeptieren, empfiehlt es sich, Parameter mit den Attributen ValueFromPipeline oder ValueFromPipelineByPropertyName zu verwenden.

    Weitere Informationen finden Sie unter about_Functions_Advanced_Parameters.

MoveNext

Die MoveNext-Methode wechselt zum nächsten Element der Auflistung. MoveNext gibt zurück True , wenn der Aufzählungsator erfolgreich erweitert wurde, False wenn der Aufzählungsator das Ende der Auflistung übergeben hat.

Hinweis

Der boolesche Wert, der von MoveNext zurückgegeben wird, wird an den Ausgabedatenstrom gesendet. Sie können die Ausgabe unterdrücken, indem Sie sie [void] in "Out-Null" eingeben oder an "Out-Null" weiterleiten.

$input.MoveNext() | Out-Null
[void]$input.MoveNext()

Reset

Die Reset Methode legt den Aufzählungsator auf seine Anfangsposition fest, die sich vor dem ersten Element in der Auflistung befindet.

Current

Die Current Eigenschaft ruft das Element in der Auflistung oder Pipeline an der aktuellen Position des Aufzählers ab.

Die Current Eigenschaft gibt weiterhin dieselbe Eigenschaft zurück, bis MoveNext aufgerufen wird.

Beispiele

Beispiel 1: Verwenden der $input-Variable

Im folgenden Beispiel löscht der Zugriff auf die $input Variable die Variable bis zum nächsten Ausführen des Prozessblocks. Mit der Reset Methode wird die $input Variable auf den aktuellen Pipelinewert zurückgesetzt.

function Test
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        "`tInput: $input"
        "`tAccess Again: $input"
        $input.Reset()
        "`tAfter Reset: $input"
    }
}

"one","two" | Test
Iteration: 0
    Input: one
    Access Again:
    After Reset: one
Iteration: 1
    Input: two
    Access Again:
    After Reset: two

Der Prozessblock führt die $input Variable automatisch weiter, auch wenn Sie nicht darauf zugreifen.

$skip = $true
function Skip
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        if ($skip)
        {
            "`tSkipping"
            $skip = $false
        }
        else
        {
            "`tInput: $input"
        }
    }
}

"one","two" | Skip
Iteration: 0
    Skipping
Iteration: 1
    Input: two

Beispiel 2: Verwenden von $input außerhalb des Prozessblocks

Außerhalb des Prozessblocks stellt die $input Variable alle Werte dar, die an die Funktion weitergeleitet werden.

  • Der Zugriff auf die $input Variable löscht alle Werte.
  • Die Reset Methode setzt die gesamte Auflistung zurück.
  • Die Current Eigenschaft wird nie aufgefüllt.
  • Die MoveNext-Methode gibt "false" zurück, da die Auflistung nicht erweitert werden kann.
    • Das Aufrufen von MoveNext löscht die $input Variable.
Function All
{
    "All Values: $input"
    "Access Again: $input"
    $input.Reset()
    "After Reset: $input"
    $input.MoveNext() | Out-Null
    "After MoveNext: $input"
}

"one","two","three" | All
All Values: one two three
Access Again:
After Reset: one two three
After MoveNext:

Beispiel 3: Verwenden der $input.Current Eigenschaft

Mit der Current Eigenschaft kann mehrmals auf den aktuellen Pipelinewert zugegriffen werden, ohne die Reset Methode zu verwenden. Der Prozessblock ruft die MoveNext-Methode nicht automatisch auf.

Die Current Eigenschaft wird nie aufgefüllt, es sei denn, Sie rufen MoveNext explizit auf. Auf die Current Eigenschaft kann mehrmals innerhalb des Prozessblocks zugegriffen werden, ohne den Wert zu löschen.

function Current
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        "`tBefore MoveNext: $($input.Current)"
        $input.MoveNext() | Out-Null
        "`tAfter MoveNext: $($input.Current)"
        "`tAccess Again: $($input.Current)"
    }
}

"one","two" | Current
Iteration: 0
    Before MoveNext:
    After MoveNext: one
    Access Again: one
Iteration: 1
    Before MoveNext:
    After MoveNext: two
    Access Again: two

Beispiel 4: Verwenden der variablen $foreach

Im Gegensatz zu der $input Variablen stellt die $foreach Variable immer alle Elemente in der Auflistung dar, wenn direkt darauf zugegriffen wird. Verwenden Sie die Current Eigenschaft, um auf das aktuelle Auflistungselement zuzugreifen, und die ResetUnd MoveNext-Methoden , um den Wert zu ändern.

Hinweis

Jede Iteration der foreach Schleife ruft automatisch die MoveNext-Methode auf.

Die folgende Schleife wird nur zweimal ausgeführt. In der zweiten Iteration wird die Auflistung in das dritte Element verschoben, bevor die Iteration abgeschlossen ist. Nach der zweiten Iteration gibt es jetzt keine weiteren Werte zum Durchlaufen, und die Schleife wird beendet.

Die MoveNext-Eigenschaft wirkt sich nicht auf die Variable aus, die durch die Auflistung ($Num) durchlaufen werden soll.

$i = 0
foreach ($num in ("one","two","three"))
{
    "Iteration: $i"
    $i++
    "`tNum: $num"
    "`tCurrent: $($foreach.Current)"

    if ($foreach.Current -eq "two")
    {
        "Before MoveNext (Current): $($foreach.Current)"
        $foreach.MoveNext() | Out-Null
        "After MoveNext (Current): $($foreach.Current)"
        "Num has not changed: $num"
    }
}
Iteration: 0
        Num: one
        Current: one
Iteration: 1
        Num: two
        Current: two
Before MoveNext (Current): two
After MoveNext (Current): three
Num has not changed: two

Mit der Reset Methode wird das aktuelle Element in der Auflistung zurückgesetzt. Im folgenden Beispiel werden die ersten beiden Elemente zweimal durchlaufen, da die Reset Methode aufgerufen wird. Nach den ersten beiden Schleifen schlägt die Anweisung fehl, und die if Schleife wird normalerweise durch alle drei Elemente durchlaufen.

Wichtig

Dies könnte zu einer unendlichen Schleife führen.

$stopLoop = 0
foreach ($num in ("one","two", "three"))
{
    ("`t" * $stopLoop) + "Current: $($foreach.Current)"

    if ($num -eq "two" -and $stopLoop -lt 2)
    {
        $foreach.Reset() | Out-Null
        ("`t" * $stopLoop) + "Reset Loop: $stopLoop"
        $stopLoop++
    }
}
Current: one
Current: two
Reset Loop: 0
        Current: one
        Current: two
        Reset Loop: 1
                Current: one
                Current: two
                Current: three

Beispiel 5: Verwenden der $switch Variablen

Die $switch Variable verfügt über die genauen Regeln wie die $foreach Variable. Im folgenden Beispiel werden alle Aufzählungskonzepte veranschaulicht.

Hinweis

Beachten Sie, wie der NotEvaluated-Fall nie ausgeführt wird, auch wenn es keine break Anweisung nach der MoveNext-Methode gibt.

$values = "Start", "MoveNext", "NotEvaluated", "Reset", "End"
$stopInfinite = $false
switch ($values)
{
    "MoveNext" {
        "`tMoveNext"
        $switch.MoveNext() | Out-Null
        "`tAfter MoveNext: $($switch.Current)"
    }
    # This case is never evaluated.
    "NotEvaluated" {
        "`tAfterMoveNext: $($switch.Current)"
    }

    "Reset" {
        if (!$stopInfinite)
        {
            "`tReset"
            $switch.Reset()
            $stopInfinite = $true
        }
    }

    default {
        "Default (Current): $($switch.Current)"
    }
}
Default (Current): Start
    MoveNext
    After MoveNext: NotEvaluated
    Reset
Default (Current): Start
    MoveNext
    After MoveNext: NotEvaluated
Default (Current): End

Weitere Informationen