about_Operators
Kurze Beschreibung
Beschreibt die Operatoren, die von PowerShell unterstützt werden.
Lange Beschreibung
Ein Operator ist ein Sprachelement, das Sie in einem Befehl oder Ausdruck verwenden können. PowerShell unterstützt verschiedene Arten von Operatoren, um Werte zu bearbeiten.
Arithmetische Operatoren
Verwenden Sie arithmetische Operatoren (+
, -
, *
, /
, %
), um Werte in einem Befehl oder Ausdruck zu berechnen. Mit diesen Operatoren können Sie Werte addieren, subtrahieren, multiplizieren oder dividieren und den Rest (Modulus) eines Divisionsvorgangs berechnen.
Der Additionsoperator verkettet Elemente. Der Multiplikationsoperator gibt die angegebene Anzahl von Kopien jedes Elements zurück. Sie können arithmetische Operatoren für jeden .NET-Typ verwenden, der sie implementiert, z. B.: Int
, , , String
, DateTime
Hashtable
und Arrays.
Bitweise Operatoren (-band
, -bor
, -bxor
, -shl
-bnot
, -shr
) bearbeiten die Bitmuster in Werten.
Weitere Informationen finden Sie unter about_Arithmetic_Operators.
Zuweisungsoperatoren
Verwenden Sie Zuordnungsoperatoren (=
, +=
, -=
, *=
, /=
, ), %=
um Variablen zuzuweisen, zu ändern oder werte anzufügen. Sie können arithmetische Operatoren mit Zuweisung kombinieren, um das Ergebnis der arithmetischen Operation einer Variablen zuzuweisen.
Weitere Informationen finden Sie unter about_Assignment_Operators.
Vergleichsoperatoren
Verwenden Sie Vergleichsoperatoren (-eq
, -ne
, -gt
, -lt
, -le
, ), -ge
um Werte und Testbedingungen zu vergleichen. Sie können beispielsweise zwei Zeichenfolgenwerte vergleichen, um zu bestimmen, ob sie gleich sind.
Die Vergleichsoperatoren enthalten auch Operatoren, die Muster im Text suchen oder ersetzen. Die Operatoren (-match
, , -replace
-notmatch
) verwenden reguläre Ausdrücke, und (-like
, -notlike
) verwenden Wildcards*
.
Eingrenzungsvergleichsoperatoren bestimmen, ob ein Testwert in einem Referenzsatz (-in
, -notin
, , -contains
) -notcontains
angezeigt wird.
Typvergleichsoperatoren (-is
, ) bestimmen, -isnot
ob ein Objekt eines bestimmten Typs ist.
Weitere Informationen finden Sie unter about_Comparison_Operators.
Logische Operatoren
Verwenden Sie logische Operatoren (-and
, -or
, -xor
, -not
, ), !
um bedingte Anweisungen mit einer einzigen komplexen bedingungsbedingten Anweisung zu verbinden. Sie können beispielsweise einen logischen -and
Operator verwenden, um einen Objektfilter mit zwei verschiedenen Bedingungen zu erstellen.
Weitere Informationen finden Sie unter about_Logical_Operators.
Umleitungsoperatoren
Verwenden Sie Umleitungsoperatoren (>
, >>
, 2>
, 2>>
und 2>&1
), um die Ausgabe eines Befehls oder Ausdrucks an eine Textdatei zu senden. Die Umleitungsoperatoren funktionieren wie das Out-File
Cmdlet (ohne Parameter), aber sie ermöglichen es Ihnen auch, die Fehlerausgabe an angegebene Dateien umzuleiten. Sie können auch das Cmdlet verwenden, um die Tee-Object
Ausgabe umzuleiten.
Weitere Informationen finden Sie unter about_Redirection
Operatoren für Teilen und Beitreten
Die -split
Operatoren dividieren und -join
kombinieren Teilzeichenfolgen. Der -split
Operator teilt eine Zeichenfolge in Teilzeichenfolgen auf. Der -join
Operator verkettet mehrere Zeichenfolgen in eine einzelne Zeichenfolge.
Weitere Informationen finden Sie unter about_Split und about_Join.
Typoperatoren
Verwenden Sie die Typoperatoren (-is
, -isnot
, -as
), um den .NET-Typ eines Objekts zu suchen oder zu ändern.
Weitere Informationen finden Sie unter about_Type_Operators.
Unary Operators (Unäre Operatoren)
Verwenden Sie die Unär- ++
und --
Operatoren, um Werte zu erhöhen oder zu erhöhen und -
zu negieren. Wenn Sie beispielsweise die Variable $a
von 9
zu 10
" inkrementieren" möchten, geben Sie die Zeichenfolge $a++
ein.
Weitere Informationen finden Sie unter about_Arithmetic_Operators.
Spezielle Operatoren
Spezielle Operatoren verfügen über spezielle Anwendungsfälle, die nicht in eine andere Operatorgruppe passen. Mit speziellen Operatoren können Sie beispielsweise Befehle ausführen, den Datentyp eines Werts ändern oder Elemente aus einem Array abrufen.
Gruppierungsoperator ( )
Wie in anderen Sprachen (...)
dient die Außerkraftsetzung der Operatorrangfolge in Ausdrücken. Beispiel: (1 + 2) / 3
In PowerShell gibt es jedoch zusätzliche Verhaltensweisen.
Gruppieren von Ergebnisausdrücken
(...)
ermöglicht es Ihnen, die Ausgabe eines Befehls an einem Ausdruck teilzunehmen.
Zum Beispiel:
PS> (Get-Item *.txt).Count -gt 10
True
Hinweis
Das Umschließen eines Befehls in Klammern bewirkt, dass die automatische Variable $?
festgelegt $true
wird, auch wenn der eingeschlossene Befehl selbst auf " $false
festgelegt $?
ist.
Beispielsweise (Get-Item /Nosuch); $?
wird "True" unerwartet zurückgegeben. Weitere Informationen $?
finden Sie unter about_Automatic_Variables.
Gruppierte Ausdrücke für die Leitung
Wenn sie als erstes Segment einer Pipeline verwendet wird, verursacht das Umschließen eines Befehls oder Ausdrucks in Klammern in der Regel die Enumeration des Ausdrucksergebnisses. Wenn die Klammern einen Befehl umschließen, wird dieser ausgeführt, um den Abschluss aller im Arbeitsspeicher gesammelten Ausgaben auszuführen, bevor die Ergebnisse über die Pipeline gesendet werden.
Beispielsweise unterscheiden sich die Ausgaben für diese Anweisungen:
PS> ConvertFrom-Json '["a", "b"]' | ForEach-Object { "The value is '$_'" }
The value is 'a b'
PS> (ConvertFrom-Json '["a", "b"]') | ForEach-Object { "The value is '$_'" }
The value is 'a'
The value is 'b'
Durch gruppieren eines Ausdrucks vor der Piping wird außerdem sichergestellt, dass die nachfolgende Objekt-nach-Objekt-Verarbeitung die Enumeration, die der Befehl zum Erzeugen seiner Ausgabe verwendet, nicht beeinträchtigen kann.
So kann z. B. das Anfügen der Ausgabe Get-ChildItem
Rename-Item
zu unerwarteten Effekten führen, bei denen ein Element umbenannt wird, dann erneut ermittelt und ein zweites Mal umbenannt werden.
Gruppierung von Zuordnungsanweisungen
Nicht gruppierte Zuordnungsanweisungen geben keine Ausgabewerte aus. Beim Gruppieren einer Zuordnungsanweisung wird der Wert der zugewiesenen Variablen übergeben und kann in größeren Ausdrücken verwendet werden. Zum Beispiel:
PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True
Durch das Umschließen der Anweisung in Klammern wird sie in einen Ausdruck umgewandelt, der den Wert ausgibt $var
.
Dieses Verhalten gilt für alle Zuordnungsoperatoren, einschließlich verbundoperatoren wie +=
, und die Operatoren inkrementieren (++
) und Dekrement (--
)
Die Reihenfolge des Vorgangs für Inkrementierung und Dekrement hängt jedoch von ihrer Position ab.
PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1
Im Präfixfall wird der Wert von $i
vor der Ausgabe erhöht. Im Postfix-Fall wird der Wert nach $i
der Ausgabe inkrementiert.
Sie können diese Technik auch im Kontext einer bedingungsbedingten Anweisung verwenden, z. B. die if
Anweisung.
if ($textFiles = Get-ChildItem *.txt) {
$textFiles.Count
}
Wenn in diesem Beispiel keine Dateien übereinstimmen, gibt der Get-ChildItem
Befehl nichts zurück und weist nichts zu $textFiles
, was in einem booleschen Kontext berücksichtigt $false
wird. Wenn mindestens ein FileInfo-Objekt zugewiesen $textFiles
ist, wird die Bedingung ausgewertet $true
. Sie können mit dem Wert im $textFiles
Textkörper der if
Anweisung arbeiten.
Hinweis
Diese Technik ist zwar praktisch und prägnant, kann jedoch zu Verwirrung zwischen dem Zuordnungsoperator (=
) und dem Gleichheitsvergleichsoperator (-eq
) führen.
Subexpression-Operator $( )
Gibt das Ergebnis einer oder mehrerer Anweisungen zurück. Gibt für ein einzelnes Ergebnis einen Skalar zurück. Gibt für mehrere Ergebnisse ein Array zurück. Verwenden Sie diese Vorgehensweise, wenn Sie einen Ausdruck innerhalb eines anderen Ausdrucks verwenden möchten. Um beispielsweise die Ergebnisse des Befehls in einen Zeichenfolgenausdruck einzubetten.
PS> "Today is $(Get-Date)"
Today is 12/02/2019 13:15:20
PS> "Folder list: $((dir c:\ -dir).Name -join ', ')"
Folder list: Program Files, Program Files (x86), Users, Windows
Array-Subexpression-Operator @( )
Gibt das Ergebnis einer oder mehrerer Anweisungen als Array zurück. Das Ergebnis ist immer ein Array von 0 oder mehr Objekten.
PS> $list = @(Get-Process | Select-Object -First 10; Get-Service | Select-Object -First 10 )
PS> $list.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> $list.Count
20
PS> $list = @(Get-Service | Where-Object Status -eq Starting )
PS> $list.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> $list.Count
0
Hashtabellenliteralsyntax @{}
Ähnlich wie bei der Arrayunterexpression wird diese Syntax verwendet, um eine Hashtabelle zu deklarieren. Weitere Informationen finden Sie unter about_Hash_Tables.
Anrufanbieter &
Führt einen Befehl, ein Skript oder einen Skriptblock aus. Mit dem Aufrufoperator( auch als Aufrufoperator bezeichnet) können Sie Befehle ausführen, die in Variablen gespeichert und durch Zeichenfolgen oder Skriptblöcke dargestellt werden. Der Aufrufoperator wird in einem untergeordneten Bereich ausgeführt. Weitere Informationen zu Bereichen finden Sie unter about_Scopes. Sie können dies verwenden, um Zeichenfolgen zu erstellen, die den benötigten Befehl, Parameter und Argumente enthalten, und dann die Zeichenfolge so aufrufen, als wäre sie ein Befehl. Die von Ihnen erstellten Zeichenfolgen müssen den gleichen Analyseregeln entsprechen wie ein Befehl, den Sie an der Befehlszeile eingeben. Weitere Informationen finden Sie unter about_Parsing.
In diesem Beispiel wird ein Befehl in einer Zeichenfolge gespeichert und mithilfe des Aufrufoperators ausgeführt.
PS> $c = "get-executionpolicy"
PS> $c
get-executionpolicy
PS> & $c
AllSigned
Der Aufrufoperator analysiert keine Zeichenfolgen. Dies bedeutet, dass Sie befehlsparameter in einer Zeichenfolge nicht verwenden können, wenn Sie den Aufrufoperator verwenden.
PS> $c = "Get-Service -Name Spooler"
PS> $c
Get-Service -Name Spooler
PS> & $c
& : The term 'Get-Service -Name Spooler' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.
At line:1 char:2
+ & $c
+ ~~
+ CategoryInfo : ObjectNotFound: (Get-Service -Name Spooler:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Das Cmdlet Invoke-Expression kann Code ausführen, der bei Verwendung des Aufrufoperators Analysefehler verursacht.
PS> & "1+1"
&: The term '1+1' is not recognized as a name of a cmdlet, function, script
file, or executable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.
At line:1 char:2
+ & "1+1"
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (1+1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS> Invoke-Expression "1+1"
2
Sie können ein Skript mit dem Dateinamen ausführen. Eine Skriptdatei muss über eine .ps1
Dateierweiterung verfügen, damit sie ausführbar ist. Dateien mit Leerzeichen in ihrem Pfad müssen in Anführungszeichen eingeschlossen werden. Wenn Sie versuchen, den in Anführungszeichen gesetzten Pfad auszuführen, zeigt PowerShell den Inhalt der Zeichenfolge an, anstatt das Skript auszuführen. Mit dem Aufrufoperator können Sie den Inhalt der Zeichenfolge ausführen, die den Dateinamen enthält.
PS C:\Scripts> Get-ChildItem
Directory: C:\Scripts
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/28/2018 1:36 PM 58 script name with spaces.ps1
PS C:\Scripts> ".\script name with spaces.ps1"
.\script name with spaces.ps1
PS C:\Scripts> & ".\script name with spaces.ps1"
Hello World!
Weitere Informationen zu Skriptblöcken finden Sie unter about_Script_Blocks.
Umwandlungsoperator [ ]
Wandelt Objekte in den angegebenen Typ um oder beschränkt sie. Wenn die Objekte nicht konvertiert werden können, generiert PowerShell einen Fehler.
[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'
Eine Umwandlung kann auch ausgeführt werden, wenn eine Variable der Umwandlungsnotation zugewiesen wird.
Kommaoperator ,
Als binärer Operator erstellt das Komma ein Array oder fügt an das zu erstellende Array an. Im Ausdrucksmodus erstellt das Komma als unärer Operator ein Array mit nur einem Element. Platzieren Sie das Komma vor dem Element.
$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)
Da Write-Output
ein Argument erwartet wird, müssen Sie den Ausdruck in Klammern setzen.
Dot Sourcing-Operator .
Führt ein Skript im aktuellen Bereich aus, sodass alle Funktionen, Aliase und Variablen, die das Skript erstellt, dem aktuellen Bereich hinzugefügt werden und vorhandene außer Kraft gesetzt werden. Parameter, die vom Skript deklariert werden, werden zu Variablen. Parameter, für die kein Wert angegeben wurde, werden variablen ohne Wert. Die automatische Variable $args
wird jedoch beibehalten.
. c:\scripts\sample.ps1 1 2 -Also:3
Hinweis
Auf den Punkt-Beschaffungsoperator folgt ein Leerzeichen. Verwenden Sie das Leerzeichen, um den Punkt () vom Punkt (.
) zu unterscheiden, der das aktuelle Verzeichnis darstellt.
Im folgenden Beispiel wird das Skript "Sample.ps1" im aktuellen Verzeichnis im aktuellen Bereich ausgeführt.
. .\sample.ps1
Formatoperator -f
Bieten Sie Zugriff auf das Zusammengesetztformatierungsfeature .NET. Eine zusammengesetzte Formatzeichenfolge besteht aus festem Text, der mit indizierten Platzhaltern kombiniert wird, die als Formatelemente bezeichnet werden. die den Objekten in der Liste entsprechen.
Alle Formatelemente weisen die folgende Form auf und bestehen aus folgenden Komponenten:
{index[,alignment][:formatString]}
Die übereinstimmenden geschweiften Klammern ({
und }
) sind erforderlich.
Der Formatierungsvorgang liefert eine Ergebniszeichenfolge, die sich aus dem ursprünglichen festgelegten Text und der Zeichenfolgendarstellung der Objekte in der Liste zusammensetzt. Weitere Informationen finden Sie unter Zusammengesetzte Formatierung.
Geben Sie die zusammengesetzte Formatzeichenfolge auf der linken Seite des Operators und die Objekte ein, die auf der rechten Seite des Operators formatiert werden sollen.
"{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
1 hello 3.14
Sie können einen numerischen Wert mit dem benutzerdefinierten Bezeichner "0" auf null legen. Die Anzahl der Nullen nach dem :
Wert gibt die maximale Breite an, auf die die formatierte Zeichenfolge ausgerichtet werden soll.
"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365
Wenn Sie die geschweiften Klammern ({}
) in der formatierten Zeichenfolge beibehalten müssen, können Sie diese escapen, indem Sie die geschweiften Klammern verdoppeln.
"{0} vs. {{0}}" -f 'foo'
foo vs. {0}
Indexoperator [ ]
Wählt Objekte aus indizierten Auflistungen aus, z. B. Arrays und Hashtabellen. Arrayindizes sind nullbasiert, sodass das erste Objekt als [0]
indiziert wird. Sie können auch negative Indizes verwenden, um die letzten Werte abzurufen. Hashtabellen werden nach Schlüsselwert indiziert.
Aufgrund einer Liste von Indizes gibt der Indexoperator eine Liste der Member zurück, die diesen Indizes entsprechen.
PS> $a = 1, 2, 3
PS> $a[0]
1
PS> $a[-1]
3
PS> $a[2, 1, 0]
3
2
1
(Get-HotFix | Sort-Object installedOn)[-1]
$h = @{key="value"; name="PowerShell"; version="2.0"}
$h["name"]
PowerShell
$x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
$x["doc"]
intro
-----
Once upon a time...
Wenn ein Objekt keine indizierte Auflistung ist, gibt die Verwendung des Indexoperators für den Zugriff auf das erste Element das Objekt selbst zurück. Indexwerte, die über das erste Element hinausgehen, werden zurückgegeben $null
.
PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True
Pipelineoperator |
Sendet ("Pipes") die Ausgabe des Befehls, der ihm vorausgeht, an den Befehl, der ihm folgt. Wenn die Ausgabe mehrere Objekte (eine "Auflistung") enthält, sendet der Pipelineoperator die Objekte einzeln.
Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}
Bereichsoperator ..
Der Bereichsoperator kann verwendet werden, um ein Array sequenzieller ganzzahliger Zahlen darzustellen. Die vom Bereichsoperator verknüpften Werte definieren die Anfangs- und Endwerte des Bereichs.
1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}
Sie können auch Bereiche in umgekehrter Reihenfolge erstellen.
10..1
5..-5 | ForEach-Object {Write-Output $_}
Die Anfangs- und Endwerte des Bereichs können ein beliebiges Ausdruckspaar sein, das zu einer ganzen Zahl oder einem Zeichen ausgewertet wird. Die Endpunkte des Bereichs müssen in signierte 32-Bit-Ganzzahlen ([int32]
) umgewandelt werden. Größere Werte verursachen einen Fehler. Wenn der Bereich in einem Array erfasst wird, ist die Größe des resultierenden Arrays auf (oder256mb - 8
) beschränkt 268435448
. Dies ist die maximale Größe eines Arrays in .NET Framework.
Sie können z. B. die Member einer Aufzählung für Ihre Anfangs- und Endwerte verwenden.
PS> enum Food {
Apple
Banana = 3
Kiwi = 10
}
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10
Wichtig
Der resultierende Bereich ist nicht auf die Werte der Enumeration beschränkt. Stattdessen stellt sie den Wertebereich zwischen den beiden bereitgestellten Werten dar. Sie können den Bereichsoperator nicht verwenden, um die Member einer Enumeration zuverlässig darzustellen.
Member-Access-Operator .
Greift auf die Eigenschaften und Methoden eines Objekts zu. Der Membername kann ein Ausdruck sein.
$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }
Wenn Sie powerShell 3.0 starten, wenn Sie den Operator für ein Listenauflistungsobjekt verwenden, das nicht über das Element verfügt, listet PowerShell die Elemente in dieser Auflistung automatisch auf und verwendet den Operator für jeden dieser Elemente. Weitere Informationen finden Sie unter about_Member-Access_Enumeration.
Statischer Memberoperator ::
Ruft die statischen Eigenschaften und Methoden einer .NET-Klasse auf. Um die statischen Eigenschaften und Methoden eines Objekts zu finden, verwenden Sie den Static-Parameter des Get-Member
Cmdlets. Der Membername kann ein Ausdruck sein.
[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }