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.
Redaktionelle Notiz
Wichtig
Die Windows PowerShell Language Specification 3.0 wurde im Dezember 2012 veröffentlicht und basiert auf Windows PowerShell 3.0. Diese Spezifikation spiegelt nicht den aktuellen Status von PowerShell wider. Es ist nicht geplant, diese Dokumentation zu aktualisieren, um den aktuellen Zustand widerzuspiegeln. Diese Dokumentation wird hier zur historischen Referenz vorgestellt.
Das Spezifikationsdokument ist als Microsoft Word-Dokument aus dem Microsoft Download Center unter: https://www.microsoft.com/download/details.aspx?id=36389 verfügbar. Dieses Word-Dokument wurde für die Darstellung auf Microsoft Learn konvertiert. Während der Konvertierung wurden einige redaktionelle Änderungen vorgenommen, um die Formatierung für die Docs-Plattform zu berücksichtigen. Einige Tippfehler und kleinere Fehler wurden korrigiert.
3.1 Anbieter und Laufwerke
Ein Anbieter ermöglicht den Zugriff auf Daten und Komponenten, auf die sonst nicht einfach über die Befehlszeile zugegriffen werden kann. Die Daten werden in einem konsistenten Format dargestellt, das einem Dateisystemlaufwerk ähnelt.
Die Daten, die ein Anbieter verfügbar macht, werden auf einem Laufwerkangezeigt, und auf die Daten wird über einen Pfad zugegriffen, genau wie auf einem Datenträgerlaufwerk. Integrierte Cmdlets für jeden Anbieter verwalten die Daten auf dem Anbieterlaufwerk.
PowerShell enthält die folgenden integrierten Anbieter, um auf die verschiedenen Datentypen von Datenspeichern zuzugreifen:
Provider | Laufwerkname | Beschreibung | Ref. |
---|---|---|---|
Alias | Alias: | PowerShell-Aliase | §3.1.1 |
Umwelt | Env: | Umgebungsvariablen | §3.1.2 |
Dateisystem | A:, B:, C:, ... | Datenträgerlaufwerke, Verzeichnisse und Dateien | §3.1.3 |
Funktion | Funktion: | PowerShell-Funktionen | §3.1.4 |
Variable | Variable: | PowerShell-Variablen | §3.1.5 |
Windows PowerShell:
Provider | Laufwerkname | Beschreibung |
---|---|---|
Zertifikat | Zertifikat | x509-Zertifikate für digitale Signaturen |
Registratur | HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) | Windows-Registrierung |
WSMan | WSMan: | WS-Management Konfigurationsinformationen |
Die folgenden Cmdlets behandeln Anbieter und Laufwerke:
- Get-PSProvider: Ruft Informationen zu mindestens einem Anbieter ab.
- Get-PSDrive: Ruft Informationen zu einem oder mehreren Laufwerken ab.
Der Typ eines Objekts, das einen Anbieter darstellt, wird in §4.5.1beschrieben. Der Typ eines Objekts, das ein Laufwerk darstellt, wird in §4.5.2beschrieben.
3.1.1 Aliase
Ein Alias ist ein alternativer Name für einen Befehl. Ein Befehl kann mehrere Aliase aufweisen, und der ursprüngliche Name und alle aliase können austauschbar verwendet werden. Ein Alias kann neu zugewiesen werden. Ein Alias ist ein Element (§3.3).
Ein Alias kann einem anderen Alias zugewiesen werden; der neue Alias ist jedoch kein Alias für den ursprünglichen Befehl.
Der Anbieteralias ist ein flacher Namespace, der nur Objekte enthält, die die Aliase darstellen. Die Variablen haben keine untergeordneten Elemente.
PowerShell verfügt über einen Satz integrierter Aliase.
Die folgenden Cmdlets behandeln Aliase:
- New-Alias: Erstellt einen Alias.
- Set-Alias: Erstellt oder ändert ein oder mehrere Aliase.
- Get-Alias: Ruft Informationen zu einem oder mehreren Aliasen ab.
- Export-Alias: Exportiert mindestens einen Alias in eine Datei.
Wenn ein Alias für einen Befehl mit New-Alias
erstellt wird, können Parameter für diesen Befehl nicht in diesen Alias eingeschlossen werden. Direkte Zuweisung zu einer Variablen im Alias: Namespace lässt jedoch zu, dass Parameter eingeschlossen werden.
Hinweis
Es ist jedoch eine einfache Sache, eine Funktion zu erstellen, die nicht mehr als den Aufruf dieses Befehls mit allen gewünschten Parametern enthält und dieser Funktion einen Alias zuweist.
Der Typ eines Objekts, das einen Alias darstellt, wird in §4.5.4beschrieben.
Aliasobjekte werden auf dem Laufwerk Alias gespeichert: (§3.1).
3.1.2 Umgebungsvariablen
Mit dem PowerShell-Umgebungsanbieter können Betriebssystemumgebungsvariablen abgerufen, hinzugefügt, geändert, gelöscht und gelöscht werden.
Die Anbieterumgebung ist ein flacher Namespace, der nur Objekte enthält, die die Umgebungsvariablen darstellen. Die Variablen haben keine untergeordneten Elemente.
Der Name einer Umgebungsvariable darf das Gleichheitszeichen (=
) nicht enthalten.
Änderungen an den Umgebungsvariablen wirken sich nur auf die aktuelle Sitzung aus.
Eine Umgebungsvariable ist ein Element (§3.3).
Der Typ eines Objekts, das eine Umgebungsvariable darstellt, wird in §4.5.6beschrieben.
Umgebungsvariable Objekte werden auf dem Laufwerk Env gespeichert: (§3.1).
3.1.3 Dateisystem
Der PowerShell FileSystem-Anbieter ermöglicht das Erstellen, Öffnen, Ändern und Löschen von Verzeichnissen und Dateien.
Der FileSystem-Anbieter ist ein hierarchischer Namespace, der Objekte enthält, die das zugrunde liegende Dateisystem darstellen.
Dateien werden auf Laufwerken mit Namen wie A:, B:, C:usw. gespeichert (§3.1). Auf Verzeichnisse und Dateien wird mithilfe der Pfadnotation zugegriffen (§3.4).
Ein Verzeichnis oder eine Datei ist ein Element (§3.3).
3.1.4 Funktionen
Mit dem PowerShell-Funktionsanbieter können Funktionen (§8.10) und Filter (§8.10.1) abgerufen, hinzugefügt, geändert, geleert und gelöscht werden.
Die Anbieterfunktion ist ein flacher Namespace, der nur die Funktionen und Filterobjekte enthält. Weder Funktionen noch Filter haben untergeordnete Elemente.
Änderungen an den Funktionen wirken sich nur auf die aktuelle Sitzung aus.
Eine Funktion ist ein Element (§3.3).
Der Typ eines Objekts, das eine Funktion darstellt, wird in §4.5.10beschrieben. Der Typ eines Objekts, das einen Filter darstellt, wird in §4.5.11beschrieben.
Funktionsobjekte werden auf den Laufwerk „Function:“ gespeichert (§3.1).
3.1.5 Variablen
Variablen können direkt in der PowerShell-Sprache definiert und bearbeitet werden.
Die Anbietervariable ist ein flacher Namespace, der nur Objekte enthält, die die Variablen darstellen. Die Variablen haben keine untergeordneten Elemente.
Die folgenden Cmdlets behandeln auch Variablen:
- neue Variable: Erstellt eine Variable
- Set-Variable: Erstellt oder ändert die Merkmale einer oder mehrerer Variablen.
- Get-Variable: Ruft Informationen zu mindestens einer Variablen ab.
- Clear-Variable: Löscht den Wert einer oder mehrerer Variablen.
- Remove-Variable: Löscht eine oder mehrere Variablen.
Da eine Variable ein Element ist (§3.3), kann sie von den meisten Element-bezogenen Cmdlets bearbeitet werden.
Der Typ eines Objekts, das eine Variable darstellt, wird in §4.5.3beschrieben.
Variable Objekte werden auf Laufwerkvariablen gespeichert: (§3.1).
3.2 Arbeitsorte
Der aktuelle Arbeitsort ist der Standardort, auf den Befehle verweisen. Dies ist der Speicherort, der verwendet wird, wenn ein expliziter Pfad (§3.4) nicht angegeben wird, wenn ein Befehl aufgerufen wird. Dieser Speicherort schließt das aktuelle Laufwerk ein.
Ein PowerShell-Host verfügt möglicherweise über mehrere Laufwerke, in diesem Fall verfügt jedes Laufwerk über einen eigenen aktuellen Speicherort.
Wenn ein Laufwerkname ohne Verzeichnis angegeben wird, wird der aktuelle Speicherort für dieses Laufwerk impliziert.
Der aktuelle Arbeitsspeicherort kann auf einem Stapel gespeichert und dann auf einen neuen Speicherort festgelegt werden. Später kann dieser gespeicherte Speicherort aus dem Stack wiederhergestellt und zum aktuellen Arbeitsverzeichnis gemacht werden. Es gibt zwei Arten von Speicherortstapeln: den Standard-Arbeitsspeicherortstapel und null oder mehr benutzerdefinierte benannte Arbeitsspeicherortstapel. Wenn eine Sitzung beginnt, ist der Standard-Arbeitsspeicherortstapel auch der aktuelle Arbeitsspeicherortstapel. Jeder benannte Arbeitsspeicherortstapel kann jedoch zum aktuellen Arbeitsspeicherortstapel erklärt werden.
Die folgenden Cmdlets behandeln Standorte:
- Set-Location: Legt den aktuellen Arbeitsspeicherort fest.
- Get-Location: Bestimmt den aktuellen Arbeitsspeicherort für die angegebenen Laufwerke oder die Arbeitsspeicherorte für die angegebenen Stapel.
- Push-Location: Speichert den aktuellen Arbeitsspeicherort am Anfang eines angegebenen Stapels von Speicherorten.
- Pop-Location: Stellt den aktuellen Arbeitsspeicherort vom Anfang eines angegebenen Stapels von Speicherorten wieder her.
Die Objekttypen, die einen Arbeitsort und einen Stapel von Arbeitsorten darstellen, werden in §4.5.5beschrieben.
3.3 Elemente
Ein Element ist ein Alias (§3.1.1), eine Variable (§3.1.5), eine Funktion (§3 .1.4), eine Umgebungsvariable (§3.1.2) oder eine Datei oder ein Verzeichnis in einem Dateisystem (§3.1.3).
Die folgenden Cmdlets behandeln Elemente:
- New-Item: Erstellt ein neues Element
- Set-Item-: Ändert den Wert eines oder mehrerer Elemente.
- Get-Item: Ruft die Elemente am angegebenen Speicherort ab.
- Get-ChildItem: Ruft die Elemente und untergeordneten Elemente am angegebenen Speicherort ab.
- Kopieren-Element-: Kopiert ein oder mehrere Elemente von einem Speicherort an einen anderen
- Move-Item-: Verschiebt ein oder mehrere Elemente von einer Position an eine andere.
- Umbenennen-Element: Benennt ein Element um.
- Aufrufelement-: Führt die Standardaktion für ein oder mehrere Elemente aus.
- Clear-Item-: Löscht den Inhalt eines oder mehrerer Elemente, löscht jedoch nicht die Elemente (siehe
- Remove-Item: Löscht die angegebenen Elemente.
Die folgenden Cmdlets behandeln den Inhalt von Elementen:
- Get-Content: Ruft den Inhalt des Elements ab.
- Add-Content: Fügt den angegebenen Elementen Inhalte hinzu.
- Set-Content: Schreibt oder ersetzt den Inhalt in einem Element.
- Clear-Content: Löscht den Inhalt eines Elements.
Der Typ eines Objekts, das ein Verzeichnis darstellt, wird in §4.5.17beschrieben. Der Typ eines Objekts, das eine Datei darstellt, wird in §4.5.18beschrieben.
3.4 Pfadnamen
Alle Elemente in einem Datenspeicher, auf die über einen PowerShell-Anbieter zugegriffen werden kann, können eindeutig anhand ihrer Pfadnamen identifiziert werden. Ein Pfadname ist eine Kombination aus dem Elementnamen, dem Container und Untercontainern, in denen sich das Element befindet, und dem PowerShell-Laufwerk, über das auf die Container zugegriffen wird.
Pfadnamen sind in einen von zwei Typen unterteilt: vollqualifizierte und relativ. Ein vollqualifizierter Pfadname besteht aus allen Elementen, die einen Pfad bilden. Die folgende Syntax zeigt die Elemente in einem vollqualifizierten Pfadnamen:
Tipp
Die ~opt~
Notation in den Syntaxdefinitionen gibt an, dass die lexikalische Entität in der Syntax optional ist.
path:
provider~opt~ drive~opt~ containers~opt~ item
provider:
module~opt~ provider ::
module:
module-name \
drive:
drive-name :
containers:
container \
containers container \
Modulname bezieht sich auf das übergeordnete Modul.
Anbieter bezieht sich auf den PowerShell-Anbieter, über den auf den Datenspeicher zugegriffen wird.
Laufwerk bezieht sich auf das PowerShell-Laufwerk, das von einem bestimmten PowerShell-Anbieter unterstützt wird.
Ein Container kann andere Container enthalten, die andere Container enthalten können usw. mit dem endgültigen Container, der ein Elemententhält. Container müssen in der hierarchischen Reihenfolge angegeben werden, in der sie im Datenspeicher vorhanden sind.
Hier ist ein Beispiel für einen Pfadnamen:
E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat
Wenn das letzte Element in einem Pfad andere Elemente enthält, handelt es sich um ein Containerelement; andernfalls ist es ein Blattelement.
In einigen Fällen ist kein vollqualifizierter Pfadname erforderlich; Ein relativer Pfadname reicht aus. Ein relativer Pfadname basiert auf dem aktuellen Arbeitsort. Mit PowerShell kann ein Element basierend auf seinem Speicherort relativ zum aktuellen Arbeitsspeicherort identifiziert werden. Ein relativer Pfadname umfasst die Verwendung einiger Sonderzeichen. Die folgende Tabelle beschreibt jedes dieser Zeichen und enthält Beispiele für relative Pfadnamen und vollqualifizierte Pfadnamen. Die Beispiele in der Tabelle basieren auf dem aktuellen Arbeitsverzeichnis, das auf C:\Windows festgelegt wird:
Symbol | Beschreibung | Relativer Pfad | Vollqualifizierter Pfad |
---|---|---|---|
. |
Aktueller Arbeitsort | .\System |
C:\Windows\System |
.. |
Übergeordnetes Element des aktuellen Arbeitsspeicherorts. | ..\Program Files |
C:\Program Files |
\ |
Laufwerkstamm des aktuellen Arbeitsspeicherorts. | \Program Files |
C:\Program Files |
nichts | Keine Sonderzeichen | System |
C:\Windows\System |
Wenn Sie einen Pfadnamen in einem Befehl verwenden möchten, geben Sie diesen Namen als vollqualifizierten oder relativen Pfadnamen ein.
Die folgenden Cmdlets behandeln Pfade:
- Convert-Path-: Wandelt einen Pfad aus einem PowerShell-Pfad in einen PowerShell-Anbieterpfad um.
- Join-Path: Kombiniert einen Pfad und einen untergeordneten Pfad zu einem einzigen Pfad.
- Resolve-Path: Löst die Platzhalterzeichen in einem Pfad auf.
- Split-Path-: Gibt den angegebenen Teil eines Pfads zurück.
- Testpfad: Bestimmt, ob die Elemente eines Pfads vorhanden sind oder ob ein Pfad wohlgeformt ist.
Einige Cmdlets (z. B. Add-Content- und Copy-Item
Dateifilter verwenden. Ein Dateifilter ist ein Mechanismus zum Angeben der Kriterien für die Auswahl aus einer Reihe von Pfaden.
Der Objekttyp, der einen aufgelösten Pfad darstellt, wird in §4.5.5beschrieben. Pfade werden häufig als Zeichenfolgen bearbeitet.
3.5 Bereiche
3.5.1 Einführung
Ein Name kann eine Variable, eine Funktion, einen Alias, eine Umgebungsvariable oder ein Laufwerk kennzeichnen. Derselbe Name kann verschiedene Elemente an unterschiedlichen Stellen in einem Skript kennzeichnen. Für jedes unterschiedliche Element, das durch einen Namen bezeichnet wird, ist dieser Name nur innerhalb des Bereichs des Skripttexts sichtbar, der als Gültigkeitsbereich bezeichnet wird. Verschiedene Elemente mit demselben Namen haben entweder unterschiedliche Geltungsbereiche oder befinden sich in unterschiedlichen Namensräumen.
Gültigkeitsbereiche können geschachtelt werden. In diesem Fall wird ein äußerer Gültigkeitsbereich als übergeordneter Gültigkeitsbereich bezeichnet, und alle geschachtelten Gültigkeitsbereiche sind untergeordnete Gültigkeitsbereiche dieses übergeordneten Gültigkeitsbereichs. Der Gültigkeitsbereich eines Namens ist der Bereich, in dem er definiert ist, und umfasst auch alle untergeordneten Bereiche, es sei denn, er wird als privat festgelegt. Innerhalb eines untergeordneten Gültigkeitsbereichs blendet ein dort definierter Name alle Elemente aus, die in übergeordneten Gültigkeitsbereichen mit demselben Namen definiert sind.
Sofern nicht Dot Source-Notation (§3.5.5) verwendet wird, erstellt jedes der folgenden Elemente einen neuen Gültigkeitsbereich:
- Skriptdatei
- Ein Skriptblock
- Eine Funktion oder ein Filter
Betrachten Sie das folgende Beispiel:
# Start of script
$x = 2; $y = 3
Get-Power $x $y
# Function defined in script
function Get-Power([int]$x, [int]$y) {
if ($y -gt 0) {
return $x * (Get-Power $x (--$y))
} else {
return 1
}
}
# End of script
Der Umfang der Variablen $x
und $y
, die im Skript erstellt wurden, ist der Textkörper dieses Skripts, einschließlich der darin definierten Funktion. Funktion Get-Power
definiert zwei Parameter mit denselben Namen.
Da jede Funktion über einen eigenen Bereich verfügt, unterscheiden sich diese Variablen von denen, die im übergeordneten Bereich definiert sind, und blenden diese aus dem übergeordneten Bereich aus. Der Funktionsbereich ist innerhalb des Skriptbereichs geschachtelt.
Beachten Sie, dass sich die Funktion rekursiv aufruft. Jedes Mal, wenn dies der Fall ist, erstellt es einen weiteren geschachtelten Bereich, jeder mit eigenen Variablen $x
und $y
.
Hier ist ein komplexeres Beispiel, das auch geschachtelte Bereiche anzeigt und Namen wiederverwendet:
# start of script scope
$x = 2 # top-level script-scope $x created
# $x is 2
F1 # create nested scope with call to function F1
# $x is 2
F3 # create nested scope with call to function F3
# $x is 2
function F1 { # start of function scope
# $x is 2
$x = $true # function-scope $x created
# $x is $true
& { # create nested scope with script block
# $x is $true
$x = 12.345 # scriptblock-scope $x created
# $x is 12.345
} # end of scriptblock scope, local $x goes away
# $x is $true
F2 # create nested scope with call to function F2
# $x is $true
} # end of function scope, local $x goes away
function F2 { # start of function scope
# $x is $true
$x = "red" # function-scope $x created
# $x is "red"
} # end of function scope, local $x goes away
function F3 { # start of function scope
# $x is 2
if ($x -gt 0) {
# $x is 2
$x = "green"
# $x is "green"
} # end of block, but not end of any scope
# $x is still "green"
} # end of function scope, local $x goes away
# end of script scope
3.5.2 Bereichsnamen und -zahlen
PowerShell unterstützt die folgenden Bereiche:
Global: Dies ist der Bereich der obersten Ebene. Alle automatischen und Einstellungsvariablen werden in diesem Gültigkeitsbereich definiert. Der globale Gültigkeitsbereich ist der übergeordnete Gültigkeitsbereich aller anderen Bereiche, und alle anderen Gültigkeitsbereiche sind untergeordnete Bereiche des globalen Gültigkeitsbereichs.
Lokal: Dies ist der aktuelle Bereich an jedem Ausführungspunkt innerhalb eines Skripts, Skriptblocks oder einer Funktion. Jeder Bereich kann der lokale Gültigkeitsbereich sein.
Skript: Dieser Bereich ist für jede Skriptdatei vorhanden, die ausgeführt wird. Der Skriptbereich ist der übergeordnete Bereich aller Bereiche, die darin erstellt wurden. Ein Skriptblock verfügt nicht über einen eigenen Skriptgültigkeitsbereich. Stattdessen ist sein Skriptgültigkeitsbereich der Bereich nächsten Vorgängerskriptdatei. Obwohl kein Modulbereich vorhanden ist, stellt der Skriptbereich die entsprechende Funktion bereit.
Namen können als privat deklariert werden. In diesem Fall sind sie außerhalb ihres übergeordneten Gültigkeitsbereichs nicht sichtbar, nicht einmal für untergeordnete Gültigkeitsbereiche. Das Konzept des private Bereichs ist kein separater Bereich; es ist ein Alias für den lokalen Bereich mit der zusätzlichen Funktion, den Namen auszublenden, wenn er als beschreibbarer Ort verwendet wird.
Bereiche können durch eine Zahl bezeichnet werden, die die relative Position eines Bereichs zu einem anderen beschreibt. Bereich 0 gibt den lokalen Bereich an, Bereich 1 gibt einen Ahnenbereich der 1-Generation an, Bereich 2 gibt einen Ahnenbereich der 2 Generation usw. an. (Bereichsnummern werden von Cmdlets verwendet, die Variablen bearbeiten.)
3.5.3 Gültigkeitsbereich von Variablennamen
Wie im folgenden Beispiel gezeigt, kann ein Variablenname mit einem von sechs verschiedenen Gültigkeitsbereichen angegeben werden.
variable-scope:
Global:
Local:
Private:
Script:
Using:
Workflow:
variable-namespace
Der Umfang ist optional. Die folgende Tabelle zeigt die Bedeutung der einzelnen Elemente in allen möglichen Kontexten. Außerdem wird der Bereich angezeigt, wenn kein Bereich explizit angegeben wird:
Bereichsmodifizierer | in einer Skriptdatei | Innerhalb eines Skriptblocks | In einer Funktion |
---|---|---|---|
Weltweit | Globaler Bereich | Globaler Bereich | Globaler Bereich |
Skript | Gültigkeitsbereich der nächsten Vorgängerskriptdatei oder Global, wenn keine nächste Vorgängerskriptdatei vorhanden ist | Gültigkeitsbereich der nächsten Vorgängerskriptdatei oder Global, wenn keine nächste Vorgängerskriptdatei vorhanden ist | Der Geltungsbereich der nächstgelegenen Vorgängerskriptdatei oder global, wenn keine nächstgelegene Vorgängerskriptdatei vorhanden ist |
Privat | Globaler/Skript-/lokaler Gültigkeitsbereich | Lokaler Bereich | Lokaler Bereich |
Local | Globaler, Skript- und lokaler Geltungsbereich | Lokaler Bereich | Lokaler Bereich |
Using | Durch die Implementierung definiert | Durch die Implementierung definiert | Durch die Implementierung definiert |
Arbeitsablauf | Durch die Implementierung definiert | Durch die Implementierung definiert | Durch die Implementierung definiert |
Nichts | Globaler/Skript-/lokaler Gültigkeitsbereich | Lokaler Bereich | Lokaler Bereich |
Gültigkeitsbereichsinformationen für Variablen können auch angegeben werden, wenn die in (§3.1.5) aufgeführte Cmdlet-Familie verwendet wird. Lesen Sie insbesondere den Parameter Scope
und die Parameter Option Private
und Option AllScope
, um weitere Informationen zu erhalten.
Der Using:
Bereichsmodifizierer wird verwendet, um auf Variablen zuzugreifen, die in einem anderen Bereich definiert sind, während Skripts über Cmdlets wie Start-Job
, Invoke-Command
oder innerhalb einer inlinescript-Anweisungausgeführt werden. Beispiel:
$a = 42
Invoke-Command --ComputerName RemoteServer { $Using:a } # returns 42
workflow foo
{
$b = "Hello"
inlinescript { $Using:b }
}
foo # returns "Hello"
Der Bereichsworkflow wird mit einer parallel-statement- oder sequence-statement-Anweisung verwendet, um auf eine im Workflow definierte Variable zuzugreifen.
3.5.4 Gültigkeitsbereich des Funktionsnamens
Ein Funktionsname kann auch einen der vier verschiedenen Bereiche aufweisen, und die Sichtbarkeit dieses Namens ist identisch mit Variablen (§3.5.3).
3.5.5 Dot Source-Notation
Wenn eine Skriptdatei, ein Skriptblock oder eine Funktion aus einer anderen Skriptdatei, einem Skriptblock oder einer anderen Funktion ausgeführt wird, erstellt die ausgeführte Skriptdatei einen neuen geschachtelten Bereich. Zum Beispiel
Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA
Wenn jedoch die Punktquellnotation verwendet wird, wird kein neuer Bereich erstellt, bevor der Befehl ausgeführt wird. Ergänzungen/Änderungen, die es an seinem eigenen lokalen Bereich vorgenommen hätte, werden stattdessen am aktuellen Bereich vorgenommen. Zum Beispiel
. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA
3.5.6. Module
So wie sich eine Skriptdatei auf höchster Ebene am Stamm einer hierarchisch verschachtelten Bereichsstruktur befindet, so verhält es sich auch mit jedem Modul (§3.14). Standardmäßig sind jedoch nur die Namen, die von einem Modul exportiert wurden, im Importkontext namentlich verfügbar. Der globale Parameter des Cmdlets Import-Module- ermöglicht exportierten Namen eine erhöhte Sichtbarkeit.
3.6 ReadOnly- und Constant-Eigenschaften
Variablen und Aliase werden durch Objekte beschrieben, die eine Reihe von Eigenschaften enthalten. Diese Eigenschaften werden von zwei Familien von Cmdlets festgelegt und bearbeitet (§3.1.5, §3.1.1). Eine solche Eigenschaft ist "Options", die auf "ReadOnly" oder "Constant" (mithilfe des Optionsparameters) festgelegt werden kann. Eine Variable oder ein alias, der als "ReadOnly" gekennzeichnet ist, kann entfernt werden, und seine Eigenschaften können geändert werden, sofern der Parameter Force angegeben ist. Eine Variable oder ein Alias, der als Konstante gekennzeichnet ist, kann jedoch weder entfernt noch in ihren Eigenschaften geändert werden.
3.7 Methodenüberladungen und Aufrufauflösung
3.7.1 Einführung
Wie in §1 angegeben, wird ein externes Verfahren, das von der Ausführungsumgebung (und in einer anderen Sprache als PowerShell geschrieben) zur Verfügung gestellt wird, als Methodebezeichnet.
Der Name einer Methode zusammen mit der Anzahl und den Typen ihrer Parameter wird zusammen als die Signaturdieser Methode bezeichnet. (Beachten Sie, dass die Signatur nicht den Rückgabetyp der Methode enthält.) Die Ausführungsumgebung kann es einem Typ ermöglichen, mehrere Methoden mit demselben Namen zu haben, sofern jeder über eine andere Signatur verfügt. Wenn mehrere Versionen einer Methode definiert sind, wird diese Methode als überladenebezeichnet. Beispielsweise enthält der Typ Math (§4.3.8) eine Reihe von Methoden namens Abs
, die den Absolutenwert einer angegebenen Zahl berechnet, wobei die angegebene Zahl einen von mehreren Typen aufweisen kann. Die Methoden in diesem Satz verfügen über die folgenden Signaturen:
Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)
In diesem Fall weisen alle Methoden die gleiche Anzahl von Argumenten auf; Ihre Signaturen unterscheiden sich nur nach Argumenttyp.
Ein weiteres Beispiel umfasst den Typ Array (§4.3.2), der eine Reihe von Methoden mit dem Namen Copy enthält, die einen Bereich von Elementen von einem Array in eine andere kopiert, beginnend am Anfang jedes Arrays (standardmäßig) oder bei einem bestimmten bestimmten Element. Die Methoden in diesem Satz verfügen über die folgenden Signaturen:
Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)
In diesem Fall unterscheiden sich die Signaturen je nach Argumenttyp und in einigen Fällen auch nach Argumentnummer.
In den meisten Aufrufen von überladenen Methoden stimmt die Anzahl und der Typ der übergebenen Argumente genau mit einer der Überladungen überein, und die ausgewählte Methode ist offensichtlich. Wenn dies jedoch nicht der Fall ist, muss es eine Möglichkeit geben, zu entscheiden, welche überladene Version aufgerufen werden soll, sofern eine vorhanden ist. Zum Beispiel
[Math]::Abs([byte]10) # no overload takes type byte
[array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes
Weitere Beispiele sind der Typ String (d. h. System.String), der zahlreiche überladene Methoden enthält.
Obwohl PowerShell Regeln zum Auflösen von Methodenaufrufen hat, die nicht exakt mit einer überladenen Signatur übereinstimmen, bietet PowerShell keine Möglichkeit, überladene Methoden zu definieren.
Hinweis
Editor-Hinweis: PowerShell 5.0 hat die Möglichkeit zum Definieren skriptbasierter Klassen hinzugefügt. Diese Klassen können überladene Methoden enthalten.
3.7.2 Auflösung der Methodenüberladung
Bei einem Methodenaufruf (§7.1.3) mit einer Liste von Argumentausdrücken und einer Reihe von Kandidatenmethoden(d. h. jene Methoden, die aufrufbar sind), wird der Mechanismus zur Auswahl der besten Methode als Überladungsauflösungbezeichnet.
Aufgrund der Menge von anwendbaren Kandidatenmethoden (§3.7.3) wird die beste Methode in dieser Menge bestimmt. Wenn der Satz nur eine Methode enthält, ist diese Methode die beste Methode. Andernfalls ist die beste Methode die eine Methode, die besser ist als alle anderen Methoden in Bezug auf die angegebene Argumentliste unter Verwendung der in §3.7.4dargestellten Regeln. Wenn es nicht genau eine Methode gibt, die besser als alle anderen Methoden ist, ist der Aufruf der Methode mehrdeutig und ein Fehler wird gemeldet.
Auf die beste Methode muss im Kontext zugegriffen werden kann, in dem sie aufgerufen wird. Ein PowerShell-Skript kann z. B. keine private oder geschützte Methode aufrufen.
Die beste Methode für einen Aufruf einer statischen Methode muss eine statische Methode sein, und die beste Methode für einen Aufruf einer Instanzmethode muss eine Instanzmethode sein.
3.7.3 Anwendbare Methode
Eine Methode gilt in Bezug auf eine Argumentliste A als anwendbar, wenn eine der folgenden Bedingungen zutrifft:
- Die Anzahl der Argumente in A ist identisch mit der Anzahl der Parameter, die die Methode akzeptiert.
- Die Methode verfügt über erforderliche M-Parameter und optionale N-Parameter, und die Anzahl der Argumente in A ist größer oder gleich M, aber kleiner als N.
- Die Methode akzeptiert eine variable Anzahl von Argumenten und die Anzahl der Argumente in A ist größer als die Anzahl der Parameter, die die Methode akzeptiert.
Zusätzlich zu einer geeigneten Anzahl von Argumenten muss jedes Argument in A dem Parameterübergabemodus des Arguments entsprechen, und der Argumenttyp muss mit dem Parametertyp übereinstimmen, oder es muss eine Konvertierung vom Argumenttyp in den Parametertyp vorhanden sein.
Wenn der Argumenttyp ref (§4.3.6) ist, muss der entsprechende Parameter auch ref sein, und der Argumenttyp für Konvertierungszwecke ist der Typ des Eigenschaftswerts aus dem Ref-Argument.
Wenn der Argumenttyp ref
ist, kann der entsprechende Parameter anstelle von ref
out
werden.
Wenn die Methode eine variable Anzahl von Argumenten akzeptiert, kann die Methode entweder in normaler Form oder erweiterten Formanwendbar sein. Wenn die Anzahl der Argumente in A mit der Anzahl von Parametern identisch ist, die die Methode akzeptiert und der letzte Parameter ein Array ist, hängt das Formular vom Rang einer von zwei möglichen Konvertierungen ab:
- Der Rang der Konvertierung vom Typ des letzten Arguments in A in den Arraytyp für den letzten Parameter.
- Der Rang der Konvertierung vom Typ des letzten Arguments in A in den Elementtyp des Arraytyps für den letzten Parameter.
Wenn die erste Konvertierung (in den Arraytyp) besser ist als die zweite Konvertierung (in den Elementtyp des Arrays), ist die Methode in normaler Form anwendbar, andernfalls gilt sie in erweiterter Form.
Wenn mehr Argumente als Parameter vorhanden sind, kann die Methode nur in erweiterter Form angewendet werden. Um in erweiterter Form anwendbar zu sein, muss der letzte Parameter einen Arraytyp aufweisen. Die Methode wird durch eine entsprechende Methode ersetzt, die den letzten Parameter durch ausreichende Parameter ersetzt hat, um jedes argument ohne Übereinstimmung in A zu berücksichtigen. Jeder zusätzliche Parametertyp ist der Elementtyp des Arraytyps für den letzten Parameter in der ursprünglichen Methode. Die oben genannten Regeln für eine anwendbare Methode werden auf diese neue Methode und Die Argumentliste A angewendet.
3.7.4 Bessere Methode
Angesichts einer Argumentliste A mit einer Reihe von Argumentausdrücken { E~1~, E~2~, ..., E~N~ }
und zwei Anwendungsmethoden M~P~
und M~Q~
mit Parametertypen { P~1~, P~2~, ..., P~N~ }
und { Q~1~, Q~2~, ..., Q~N~ }
ist M~P~
definiert, um eine bessere Methode als M~Q~
zu sein, wenn die kumulative Rangfolge der Konvertierungen für M~P~
besser ist als für M~Q~
.
Die kumulierte Rangfolge der Konvertierungen wird wie folgt berechnet. Jede Umwandlung ist je nach Anzahl der Parameter unterschiedlich viel wert, wobei die Umwandlung von E~1~
den Wert N hat, E~2~
den Wert N-1 und bis zu E~N~
den Wert 1. Wenn die Konvertierung von E~X~
in P~X~
besser ist als von E~X~
zu Q~X~
, kumuliert die M~P~
N-X+1; andernfalls kumuliert M~Q~
N-X+1. Wenn M~P~
und M~Q~
denselben Wert haben, werden die folgenden Stichentscheidungsregeln in der angegebenen Reihenfolge angewendet:
- Die kumulierte Rangfolge der Konvertierungen zwischen Parametertypen (Argumenttypen ignorieren) wird auf ähnliche Weise wie die vorherige Rangfolge berechnet, sodass
P~1~
mitQ~1~
,P~2~
mitQ~2~
, ... undP~N~
mitQ~N~
verglichen wird. Der Vergleich wird übersprungen, wenn das Argument$null
wurde oder wenn die Parametertypen keine numerischen Typen sind. Der Vergleich wird auch übersprungen, wenn die ArgumentkonvertierungE~X~
bei der Konvertierung inP~X~
Informationen verliert, aber bei der Konvertierung inQ~X~
keine Informationen verliert (oder umgekehrt). Wenn die Parameterkonvertierungstypen verglichen werden, und die Konvertierung vonP~X~
zuQ~X~
besser ist als die vonQ~X~
inP~X~
, dann kumuliert dieM~P~
N-X+1, andernfalls kumuliertM~Q~
N-X+1. Diese Bindungstrennungsregel soll die spezifischste Methode bevorzugen (d. h. die Methode mit Parametern mit den kleinsten Datentypen), wenn keine Informationen in Konvertierungen verloren gehen oder die am häufigsten verwendeten Methode bevorzugen (d. h. die Methode mit den Parametern mit den größten Datentypen), wenn Konvertierungen zu Datenverlust führen. - Wenn beide Methoden ihre erweiterte Form verwenden, ist die Methode mit mehr Parametern die bessere Methode.
- Wenn eine Methode das erweiterte Formular und das andere Normalformular verwendet, ist die Methode mit normaler Form die bessere Methode.
3.7.5 Bessere Konvertierung
Der unten markierte Text ist spezifisch für Windows PowerShell.
Konvertierungen werden auf folgende Weise bewertet, von der niedrigsten zur höchsten:
T~1~[]
bisT~2~[]
, wenn keine zuordbare Umwandlung zwischenT~1~
undT~2~
besteht- T in string, wobei T ein beliebiger Typ ist.
T~1~
bisT~2~
, wobeiT~1~
oderT~2~
eine benutzerdefinierte Umwandlung in einer implementierungsdefinierten Weise festlegen.T~1~
zuT~2~
, woT~1~
IConvertible implementiert- Von
T~1~
bisT~2~
, woT~1~
oderT~2~
die MethodeT~2~ op_Implicit(T1)
implementiert T~1~
bisT~2~
, woT~1~
oderT~2~
die MethodeT~2~ op_Explicit(T1)
implementiertT~1~
bisT~2~
, woT~2~
einen Konstruktor implementiert, der ein einzelnes Argument vom TypT~1~
annimmt.- Eine der folgenden Konvertierungen:
- string in
T
, wobeiT
eine statische MethodeT Parse(string)
oderT Parse(string, IFormatProvider)
implementiert. T~1~
bisT~2~
, wobeiT~2~
eine beliebige Enumeration ist undT~1~
entweder eine Zeichenfolge oder eine Sammlung von Objekten ist, die in eine Zeichenfolge konvertiert werden können.
- string in
T
zu PSObject, wobeiT
ein beliebiger Typ ist- Eine der folgenden Konvertierungen:
Language
- T in Bool umwandeln, wobei
T
ein beliebiger numerischer Typ ist - string in
T
, wobeiT
regex
,wmisearcher
,wmi
,wmiclass
,adsi
,adsisearcher
odertype
ist. T
bisbool
- T~1~ bis
Nullable[T~2~]
, wo eine Konvertierung vonT~1~
zuT~2~
besteht -
T
in void T~1~[]
bisT~2~[]
, bei denen eine zuweisbare Konvertierung zwischenT~1~
undT~2~
existiertT~1~
T~2~[]
, wobeiT~1~
eine Sammlung istIDictionary
bisHashtable
T
bisref
T
bisxml
scriptblock
bisdelegate
T~1~
fürT~2~
, wobeiT~1~
ein ganzzahliger Typ ist undT~2~
ein Enum ist
- T in Bool umwandeln, wobei
$null
T
, wobeiT
ein beliebiger Werttyp ist$null
bisT
, wobeiT
ein beliebiger Referenztyp ist- Eine der folgenden Konvertierungen:
byte in
T
, wobeiT
SByte
ist.UInt16
bisT
, woT
SByte
,byte
oderInt16
istInt16
bisT
, wobeiT
SByte
oderbyte
istUInt32
bisT
, woT
SByte
,byte
,Int16
,UInt16
oderint
istint
bisT
, woT
SByte
,byte
,Int16
oderUInt16
istUInt64
inT
wobeiT
istSByte
,byte
,Int16
,UInt16
,int
,UInt32
oderlong
long
bisT
, woT
SByte
,byte
,Int16
,UInt16
,int
oderUInt32
istfloat
inT
, wobeiT
ein beliebiger Integertyp oderdecimal
ist.double
bisT
, wobeiT
ein beliebiger Ganzzahltyp oder eine beliebigedecimal
istdecimal
inT
, wobeiT
ein beliebiger Integertyp ist.
- Eine der folgenden Konvertierungen:
SByte
bisT
, bei demT
byte
,uint6
,UInt32
oderUInt64
istInt16
bisT
, woT
UInt16
,UInt32
oderUInt64
istint
bisT
, wobeiT
UInt32
oderUInt64
istlong
bisUInt64
- von
decimal
bisT
, wobeiT
entwederfloat
oderdouble
ist
- Eine der folgenden Konvertierungen:
T
bisstring
, wobeiT
irgendein numerischer Typ sein kannT
bischar
, wobeiT
ein beliebiger numerischer Typ iststring
bisT
, wobeiT
ein beliebiger numerischer Typ ist
- Bei jeder der folgenden Konvertierungen werden diese Konvertierungen als zuweisbare Konvertierungen betrachtet:
- von
byte
bisT
, woT
Int16
,UInt16
,int
,UInt32
,long
,UInt64
,single
,double
oderdecimal
ist SByte
bisT
, woT
Int16
,UInt16
,int
,UInt32
,long
,UInt64
,single
,double
oderdecimal
istUInt16
T
, woT
int
,UInt32
,long
oderUInt64
,single
,double
oderdecimal
Int16
T
, woT
int
,UInt32
,long
oderUInt64
,single
,double
oderdecimal
UInt32
bisT
, woT
long
oderUInt64
,single
,double
oderdecimal
int
bisT
, bei dem/der/dasT
long
,UInt64
,single
,double
oderdecimal
istsingle
bisdouble
- von
T~1~
T~2~
, wobeiT~2~
eine Basisklasse oder Schnittstelle vonT~1~
ist. Diese Konvertierung gilt als zuzuweisende Konvertierung.string
bischar[]
T
zuT
– Diese Konvertierung gilt als zuzuweisende Konvertierung.
Für jede Konvertierung der Form T~1~
in T~2~[]
, wobei T~1~
kein Array ist und keine andere Konvertierung anwendbar ist, wenn eine Konvertierung von T~1~
in T~2~
existiert, ist die Rangfolge der Konvertierung schlechter als die von T~1~
in T~2~
, aber besser als jede Konvertierung, die geringer eingestuft ist als die von T~1~
in T~2~
.
3.8 Namenssuche
Es ist möglich, Befehle unterschiedlicher Art mit demselben Namen zu haben. Die Reihenfolge, in der die Namenssuche in einem solchen Fall ausgeführt wird, ist Alias, Funktion, Cmdlet und externer Befehl.
3.9 Suche nach Typnamen
§7.1.10 enthält die Aussage „Ein Typliteral wird in einer Implementierung durch einen nicht angegebenen zugrunde liegenden Typ dargestellt. Daher ist ein Typname ein Synonym für den zugrunde liegenden Typ." Beispiele für Typen sind int
, double
, long[]
und Hashtable
.
Typnamen werden wie folgt abgeglichen: Vergleichen Sie einen bestimmten Typnamen mit der Liste der integrierten Typbeschleuniger, z. B. „int“, „long“, „double“. Wenn eine Übereinstimmung gefunden wird, ist dies der Typ. Andernfalls nehmen Sie an, dass der Typname vollqualifiziert ist, und prüfen Sie, ob ein solcher Typ im Hostsystem vorhanden ist. Wenn eine Übereinstimmung gefunden wird, ist dies der Typ. Fügen Sie andernfalls das Namespacepräfix System.
hinzu. Wenn eine Übereinstimmung gefunden wird, ist dies der Typ. Andernfalls ist der Typname fehlerhaft. Dieser Algorithmus wird für jedes Typargument für generische Typen angewendet. Es ist jedoch nicht erforderlich, die Arität anzugeben (die Anzahl der Argumente oder Operanden, die von einer Funktion oder einem Operator übernommen wurden).
3.10 Automatische Speicherverwaltung
Verschiedene Operatoren und Cmdlets führen zur Zuordnung des Speichers für Referenztypobjekte, z. B. Zeichenfolgen und Arrays. Die Zuordnung und Das Freigeben dieses Speichers wird vom PowerShell-Laufzeitsystem verwaltet. Das bedeutet, dass PowerShell automatische Garbage Collection bereitstellt.
3.11 Ausführungsreihenfolge
Ein Nebeneffekt ist eine Änderung des Zustands der Ausführungsumgebung eines Befehls. Eine Änderung des Werts einer Variablen (über die Zuordnungsoperatoren oder die Operatoren vor und nach dem Inkrement und Dekrement) ist ein Nebeneffekt, wie eine Änderung des Inhalts einer Datei.
Sofern nicht anders angegeben, werden Anweisungen in lexikalischer Reihenfolge ausgeführt.
Mit Ausnahme einiger Operatoren sind die Reihenfolge der Auswertung von Begriffen in einem Ausdruck und die Reihenfolge, in der Nebenwirkungen stattfinden, nicht angegeben.
Ein Ausdruck, der einen Befehl aufruft, umfasst den Ausdruck, der den Befehl bestimmt, und null oder mehr Ausdrücke, die die Argumente festlegen, deren Werte an diesen Befehl übergeben werden sollen. Die Reihenfolge, in der diese Ausdrücke relativ zueinander ausgewertet werden, ist nicht angegeben.
3.12 Fehlerbehandlung
Wenn ein Befehl fehlschlägt, wird dies als Fehlerbetrachtet, und Informationen zu diesem Fehler werden in einem Fehlerdatensatzaufgezeichnet, dessen Typ nicht angegeben ist (§4.5.15); dieser Typ unterstützt jedoch Subskription.
Ein Fehler fällt in eine von zwei Kategorien. Entweder führt es zum Abbruch des Vorgangs (ein beendender Fehler) oder eben nicht (ein nicht-beendender Fehler). Bei einem Beendigungsfehler wird der Fehler aufgezeichnet, und der Vorgang wird beendet. Bei einem nicht beendeten Fehler wird der Fehler aufgezeichnet, und der Vorgang wird fortgesetzt.
Nicht beendete Fehler werden in den Fehlerdatenstrom geschrieben. Obwohl diese Informationen an eine Datei umgeleitet werden können, werden die Fehlerobjekte zuerst in Zeichenfolgen konvertiert, und wichtige Informationen in diesen Objekten würden nicht erfasst werden, was die Diagnose erschwert, wenn nicht unmöglich. Stattdessen kann der Fehlertext umgeleitet und das Fehlerobjekt in einer Variablen gespeichert werden, wie in $Error1 = command 2>&1
(§7.12).
Die automatische Variable $Error
enthält eine Auflistung von Fehlerdatensätzen, die aktuelle Fehler darstellen, und der letzte Fehler befindet sich in $Error[0]
. Diese Auflistung wird in einem Puffer beibehalten, sodass alte Datensätze verworfen werden, wenn neue hinzugefügt werden. Die automatische Variable $MaximumErrorCount
steuert die Anzahl der Datensätze, die gespeichert werden können.
$Error
enthält alle Fehler aus allen Befehlen, die zusammen in einer einzigen Sammlung vereint sind. Verwenden Sie zum Sammeln der Fehler aus einem bestimmten Befehl den allgemeinen Parameter ErrorVariable, mit dem eine benutzerdefinierte Variable angegeben werden kann, um die Auflistung aufzunehmen.
3.13 Pipelines
Eine Pipeline besteht aus einer Reihe von Befehlen, die jeweils durch den Pipeoperator |
(U+007C) getrennt werden.
Jeder Befehl empfängt Eingaben von seinem Vorgänger und schreibt die Ausgabe an den nächsten Befehl weiter. Sofern die Ausgabe am Ende der Pipeline nicht verworfen oder an eine Datei umgeleitet wird, wird sie an die Hostumgebung gesendet, wodurch sie in die Standardausgabe geschrieben werden kann. Befehle in einer Pipeline können auch Eingaben von Argumenten erhalten. Betrachten Sie beispielsweise die folgende Verwendung von Befehlen Get-ChildItem
, Sort-Object
und Process-File
, die eine Liste der Dateinamen in einem bestimmten Dateisystemverzeichnis erstellen, eine Reihe von Textdatensätzen sortieren und eine Verarbeitung für einen Textdatensatz durchführen:
Get-ChildItem
Get-ChildItem E:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt
Im ersten Fall erstellt Get-ChildItem
eine Auflistung von Namen der Dateien im aktuellen/Standardverzeichnis. Diese Auflistung wird an die Hostumgebung gesendet, die standardmäßig den Wert jedes Elements in die Standardausgabe schreibt.
Im zweiten Fall erstellt Get-ChildItem
mithilfe des Arguments E:*.txt
eine Auflistung der Namen der Dateien im angegebenen Verzeichnis. Diese Sammlung wird in den Befehl Sort-Object
geschrieben, der sie standardmäßig in aufsteigender Reihenfolge sortiert, wobei Groß-/Kleinschreibung beachtet wird (aufgrund des Arguments CaseSensitive). Die resultierende Auflistung wird dann an den Befehl Process-File
übergeben, um eine (unbekannte) Verarbeitung durchzuführen. Die Ausgabe dieses Befehls wird dann an die Datei results.txt
umgeleitet.
Wenn ein Befehl ein einzelnes Objekt schreibt, empfängt sein Nachfolger dieses Objekt und beendet dann, nachdem er seine eigenen Objekte an seinen Nachfolger geschrieben hat. Wenn ein Befehl jedoch mehrere Objekte schreibt, werden sie einzeln an den Nachfolgerbefehl übermittelt, der einmal pro Objekt ausgeführt wird. Dieses Verhalten wird als Streaming bezeichnet. Bei der Datenstromverarbeitung werden Objekte entlang der Pipeline geschrieben, sobald sie verfügbar sind, nicht, wenn die gesamte Auflistung erstellt wurde.
Bei der Verarbeitung einer Auflistung kann ein Befehl so geschrieben werden, dass er vor dem ursprünglichen Element und nach dem endgültigen Element eine spezielle Verarbeitung ausführen kann.
3.14. Module
Ein Modul ist eine eigenständige wiederverwendbare Einheit, mit der PowerShell-Code partitioniert, organisiert und abstrahiert werden kann. Ein Modul kann Befehle (z. B. Cmdlets und Funktionen) und Elemente (z. B. Variablen und Aliase) enthalten, die als einzelne Einheit verwendet werden können.
Nachdem ein Modul erstellt wurde, muss es in eine Sitzung importiert werden, bevor die darin enthaltenen Befehle und Elemente verwendet werden können. Nach dem Importieren verhalten sich Befehle und Elemente so, als ob sie lokal definiert wurden. Ein Modul wird explizit mit dem Befehl Import-Module
importiert. Ein Modul kann auch automatisch auf eine in der Implementierung definierten Weise importiert werden.
Der Typ eines Objekts, das ein Modul darstellt, wird in §4.5.12beschrieben.
Module werden in §11 ausführlich erläutert.
3.15 Platzhalterausdrücke
Ein Wildcardausdruck kann null oder mehr der folgenden Elemente enthalten:
Element | BESCHREIBUNG |
---|---|
Anderes Zeichen als *, ?, oder [ | Entspricht diesem einen Zeichen |
* | Entspricht null oder mehr Zeichen. Um ein *-Zeichen abzugleichen, verwenden Sie [*]. |
? | Entspricht einem beliebigen einzelnen Zeichen. Um ein Zeichen ? abzugleichen, verwenden Sie [?]. |
[set] | Entspricht einem beliebigen Zeichen aus set. Dieses Element darf nicht leer sein. Wenn -Satz mit ] beginnt, wird diese rechte eckige Klammer als Teil des -Satzes betrachtet, und die nächste rechte eckige Klammer beendet den Satz; andernfalls beendet die erste rechte eckige Klammer den Satz. Wenn Set mit einem Bindestrich anfängt oder endet, wird dieser Bindestrich als Teil des -Setsbetrachtet; andernfalls gibt er einen Bereich aufeinanderfolgender Unicode-Codepunkte an, wobei die Zeichen auf beiden Seiten des Bindestrichs die inklusiven Bereichsgrenzen sind. A-Z gibt z. B. die 26 englischen Großbuchstaben an, und 0-9 gibt die 10 Dezimalziffern an. |
Hinweis
Weitere Informationen finden Sie unter The Open Group Base Specifications: Pattern Matching, IEEE Std 1003.1, Ausgabe 2004. In PowerShell ist das Escapezeichen jedoch ein Hochkomma und kein umgekehrter Schrägstrich.
3.16 Reguläre Ausdrücke
Ein regulärer Ausdruck kann null oder mehr der folgenden Elemente enthalten:
Element | BESCHREIBUNG |
---|---|
Zeichen außer ., [, ^, *, $oder \ | Entspricht diesem einzelnen Zeichen |
. | Entspricht einem beliebigen einzelnen Zeichen. Um ein Zeichen . abzugleichen, verwenden Sie \.. |
[set] [^set] |
Das [set]-Element entspricht einem beliebigen Zeichen aus set. Das [^set]-Element entspricht keinem Zeichen aus set. set darf nicht leer sein. Wenn die Menge mit ] oder ^] beginnt, wird diese rechte eckige Klammer als Teil der Menge betrachtet, und die nächste rechte eckige Klammer beendet die Menge; andernfalls beendet die erste rechte eckige Klammer die Menge. Wenn set mit - oder ^- beginnt oder mit - endet, wird dieser Bindestrich als Teil von set betrachtet. Andernfalls wird ein Bereich aufeinanderfolgender Unicode-Codepunkte angegeben, wobei die Zeichen auf beiden Seiten des Bindestrichs die inklusiven Bereichstrennzeichen darstellen. A-Z gibt z. B. die 26 englischen Großbuchstaben an, und 0-9 gibt die 10 Dezimalziffern an. |
* | Entspricht null oder mehr Vorkommen des vorangehenden Elements. |
+ | Entspricht einem von mehreren Vorkommen des vorherigen Elements. |
? | Entspricht null oder einem Vorkommen des vorangehenden Elements. |
^ | Entspricht dem Anfang der Zeichenfolge. Verwenden Sie \^, um ein ^-Zeichen abzugleichen. |
$ | Entspricht dem Ende der Zeichenfolge. Um einem $-Zeichen zu entsprechen, verwenden Sie $. |
\c | Dienst als Escapezeichen für c, sodass dieser Buchstabe nicht als Element eines regulären Ausdrucks erkannt wird. |
Hinweis
Weitere Informationen finden Sie unter The Open Group Base Specifications: Regular Expressions, IEEE Std 1003.1, Ausgabe 2004.
Windows PowerShell: Zeichenklassen, die in regulären Ausdrücken von Microsoft .NET Framework verfügbar sind, werden wie folgt unterstützt:
Element | BESCHREIBUNG |
---|---|
\p{name} |
Entspricht einem beliebigen Zeichen in der benannten Zeichenklasse, die durch Namenangegeben wird. Unterstützte Namen sind Unicode-Gruppen und Blockbereiche wie Ll, Nd, Z, IsGreek und IsBoxDrawing. |
\P{name} |
Entspricht Text, der nicht in den inname angegebenen Gruppen und Blockbereichen enthalten ist. |
\w |
Entspricht einem beliebigen Wortzeichen. Entspricht den Unicode-Zeichenkategorien [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] . Wenn das ECMAScript-kompatible Verhalten mit der ECMAScript-Option angegeben wird, entspricht \w [a-zA-Z_0-9] . |
\W |
Entspricht einem beliebigen Nicht-Wortzeichen. Entspricht den Unicode-Kategorien [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] . |
\s |
Entspricht einem beliebigen Leerzeichen. Entspricht den Unicode-Zeichenkategorien [\f\n\r\t\v\x85\p{Z}] . |
\S |
Entspricht einem beliebigen Nicht-Leerraumzeichen. Entspricht den Unicode-Zeichenkategorien [\^\f\n\r\t\v\x85\p{Z}] . |
\d |
Trifft auf jede Dezimalziffer zu. Entspricht \p{Nd} für Unicode und [0-9] für Nicht-Unicode-Verhalten. |
\D |
Entspricht einer beliebigen Nicht-Ziffer. Entspricht \P{Nd} für Unicode und [\^0-9] für Nicht-Unicode-Verhalten. |
Quantifizierer, die in regulären Ausdrücken von Microsoft .NET Framework verfügbar sind, werden wie folgt unterstützt:
Element | BESCHREIBUNG |
---|---|
* |
Gibt null oder mehr Übereinstimmungen an, z. B \w* oder (abc)*. äquivalent mit {0,} . |
+ |
Entspricht sich wiederholenden Instanzen der vorangehenden Zeichen. |
? |
Gibt null oder eine Übereinstimmung(en) an, z. B \w? oder (abc)? . Entspricht {0,1} . |
{n} |
Gibt genau n Übereinstimmungen an, z. B (pizza){2} . |
{n,} |
Gibt mindestens n Übereinstimmungen an, z. B (abc){2,} . |
{n,m} |
Gibt mindestens n, höchstens aber m Übereinstimmungen an. |