Delen via


about_Operators

Korte beschrijving

Hierin worden de operators beschreven die worden ondersteund door PowerShell.

Lange beschrijving

Een operator is een taalelement dat u kunt gebruiken in een opdracht of expressie. PowerShell ondersteunt verschillende typen operators om u te helpen waarden te bewerken.

Rekenkundige operators

Gebruik rekenkundige operatoren (+, -, *, , /) %om waarden te berekenen in een opdracht of expressie. Met deze operatoren kunt u waarden optellen, aftrekken, vermenigvuldigen of delen en de rest (modulus) van een delingsbewerking berekenen.

De operator voor optellen voegt elementen samen. De vermenigvuldigingsoperator retourneert het opgegeven aantal kopieën van elk element. U kunt rekenkundige operators gebruiken op elk .NET-type waarmee ze worden geïmplementeerd, zoals: Int, String, DateTime, Hashtableen Matrices.

Bitwise operators (-band, -bor, -bxor, -bnot, -shl, ) -shrmanipuleren de bitpatronen in waarden.

Zie about_Arithmetic_Operators voor meer informatie.

Toewijzingsoperators

Gebruik toewijzingsoperatoren (=, +=, -=, *=, /=, ) %=om waarden toe te wijzen, te wijzigen of toe te voegen aan variabelen. U kunt rekenkundige operatoren combineren met toewijzing om het resultaat van de rekenkundige bewerking toe te wijzen aan een variabele.

Zie about_Assignment_Operators voor meer informatie.

Vergelijkingsoperators

Gebruik vergelijkingsoperatoren (-eq, -ne, -gt, -lt, -le, ) -geom waarden en testvoorwaarden te vergelijken. U kunt bijvoorbeeld twee tekenreekswaarden vergelijken om te bepalen of ze gelijk zijn.

De vergelijkingsoperatoren bevatten ook operatoren die patronen in tekst zoeken of vervangen. De operators (, , ) gebruiken reguliere expressies en (-like, -notlike) gebruiken jokertekens *. -replace-notmatch-match

Insluitingsvergelijkingsoperators bepalen of een testwaarde wordt weergegeven in een referentieset (-in, -notin, -contains, ). -notcontains

Operatoren voor typevergelijking (-is, -isnot) bepalen of een object van een bepaald type is.

Zie about_Comparison_Operators voor meer informatie.

Logische operators

Gebruik logische operators (-and, -or, -xor, -not, ) !om voorwaardelijke instructies te verbinden met één complexe voorwaardelijk. U kunt bijvoorbeeld een logische -and operator gebruiken om een objectfilter te maken met twee verschillende voorwaarden.

Zie about_Logical_Operators voor meer informatie.

Omleidingsoperators

Gebruik omleidingsoperators (>, >>, 2>, 2>>en 2>&1) om de uitvoer van een opdracht of expressie naar een tekstbestand te verzenden. De omleidingsoperators werken als de Out-File cmdlet (zonder parameters), maar u kunt ook foutuitvoer omleiden naar opgegeven bestanden. U kunt de Tee-Object cmdlet ook gebruiken om uitvoer om te leiden.

Zie about_Redirection voor meer informatie

Splits- en joinoperators

De -split operatoren en -join delen en combineren subtekenreeksen. De -split operator splitst een tekenreeks in subtekenreeksen. De -join operator voegt meerdere tekenreeksen samen tot één tekenreeks.

Zie about_Split en about_Join voor meer informatie.

Typeoperators

Gebruik de typeoperators (-is, -isnot, -as) om het .NET-type van een object te zoeken of te wijzigen.

Zie about_Type_Operators voor meer informatie.

Unaire operatoren

Gebruik de unaire ++ operatoren en -- om waarden te verhogen of verlagen en - voor negatie. Als u bijvoorbeeld de variabele $a van 9 wilt verhogen naar 10, typt $a++u .

Zie about_Arithmetic_Operators voor meer informatie.

Speciale operatoren

Speciale operators hebben specifieke gebruiksvoorbeelden die niet in een andere operatorgroep passen. Met speciale operators kunt u bijvoorbeeld opdrachten uitvoeren, het gegevenstype van een waarde wijzigen of elementen ophalen uit een matrix.

Groeperingsoperator ( )

Net als in andere talen wordt de (...) prioriteit van operatoren in expressies overschreven. Bijvoorbeeld: (1 + 2) / 3

In PowerShell zijn er echter aanvullende gedragingen.

Resultaatexpressies groeperen

(...) hiermee kunt u uitvoer van een opdracht laten deelnemen aan een expressie. Bijvoorbeeld:

PS> (Get-Item *.txt).Count -gt 10
True

Gegroepeerde expressies voor pijpen

Bij gebruik als het eerste segment van een pijplijn, zorgt het verpakken van een opdracht of expressie tussen haakjes steevast voor opsomming van het expressieresultaat. Als de haakjes een opdracht bevatten, wordt deze uitgevoerd tot voltooiing met alle uitvoer die in het geheugen is verzameld voordat de resultaten via de pijplijn worden verzonden.

Het groeperen van een expressie voordat u doorsneert, zorgt er ook voor dat de volgende object-voor-objectverwerking geen invloed kan hebben op de opsomming die de opdracht gebruikt om de uitvoer te produceren.

Toewijzingsinstructies groeperen

Niet-gegroepeerde toewijzingsinstructies leveren geen waarden op. Bij het groeperen van een toewijzingsinstructie wordt de waarde van de toegewezen variabele doorgegeven en kan deze worden gebruikt in grotere expressies. Bijvoorbeeld:

PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True

Door de instructie tussen haakjes te verpakken, wordt deze omgezet in een expressie waarmee de waarde van $varwordt uitgevoerd.

Dit gedrag is van toepassing op alle toewijzingsoperators, inclusief samengestelde operators zoals +=, en de operators increment (++) en verlagen (--). De volgorde van de bewerking voor verhoging en degradatie is echter afhankelijk van hun positie.

PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1

In het geval van het voorvoegsel wordt de waarde van $i verhoogd voordat deze wordt uitgevoerd. In het postfix-geval wordt de waarde van $i verhoogd nadat deze is uitgevoerd.

U kunt deze techniek ook gebruiken in de context van een voorwaardelijke instructie, zoals de if instructie.

if ($textFiles = Get-ChildItem *.txt) {
    $textFiles.Count
}

In dit voorbeeld, als er geen bestanden overeenkomen, retourneert de Get-ChildItem opdracht niets en wijst niets toe aan $textFiles, wat wordt beschouwd $false in een booleaanse context. Als een of meer FileInfo-objecten zijn toegewezen aan $textFiles, wordt door de voorwaarde geëvalueerd.$true U kunt werken met de waarde van $textFiles in de hoofdtekst van de if instructie.

Notitie

Hoewel deze techniek handig en beknopt is, kan deze leiden tot verwarring tussen de toewijzingsoperator (=) en de gelijkheidsvergelijkingsoperator (-eq).

Operator voor subexpressie $( )

Retourneert het resultaat van een of meer instructies. Voor één resultaat retourneert een scalaire waarde. Voor meerdere resultaten retourneert een matrix. Gebruik deze optie als u een expressie in een andere expressie wilt gebruiken. Als u bijvoorbeeld de resultaten van de opdracht wilt insluiten in een tekenreeksexpressie.

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

Operator voor matrixsubexpressie @( )

Retourneert het resultaat van een of meer instructies als een matrix. Het resultaat is altijd een matrix van 0 of meer objecten.

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

Letterlijke syntaxis van hashtabel @{}

Net als bij de matrixsubexpressie wordt deze syntaxis gebruikt om een hashtabel te declareren. Zie about_Hash_Tables voor meer informatie.

Oproepoperator &

Hiermee voert u een opdracht, script of scriptblok uit. Met de aanroepoperator, ook wel de aanroepoperator genoemd, kunt u opdrachten uitvoeren die zijn opgeslagen in variabelen en worden vertegenwoordigd door tekenreeksen of scriptblokken. De aanroepoperator wordt uitgevoerd in een onderliggend bereik. Zie about_Scopes voor meer informatie over bereiken. U kunt dit gebruiken om tekenreeksen te maken die de opdracht, parameters en argumenten bevatten die u nodig hebt, en vervolgens de tekenreeks aanroepen alsof het een opdracht is. De tekenreeksen die u maakt, moeten dezelfde parseerregels volgen als een opdracht die u typt op de opdrachtregel. Zie about_Parsing voor meer informatie.

In dit voorbeeld wordt een opdracht in een tekenreeks opgeslagen en uitgevoerd met behulp van de aanroepoperator.

PS> $c = "get-executionpolicy"
PS> $c
get-executionpolicy
PS> & $c
AllSigned

De aanroepoperator parseert geen tekenreeksen. Dit betekent dat u geen opdrachtparameters in een tekenreeks kunt gebruiken wanneer u de aanroepoperator gebruikt.

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.

De Cmdlet Invoke-Expression kan code uitvoeren die parseringsfouten veroorzaakt bij het gebruik van de aanroepoperator.

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.

PS> Invoke-Expression "1+1"
2

U kunt een script uitvoeren met behulp van de bestandsnaam. Een scriptbestand moet een .ps1 bestandsextensie hebben om uitvoerbaar te zijn. Bestanden met spaties in het pad moeten tussen aanhalingstekens worden geplaatst. Als u het pad met aan geciteerde gegevens probeert uit te voeren, wordt in PowerShell de inhoud van de aangeroepen tekenreeks weergegeven in plaats van het script uit te voeren. Met de aanroepoperator kunt u de inhoud van de tekenreeks met de bestandsnaam uitvoeren.

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!

Zie about_Script_Blocks voor meer informatie over scriptblokken.

Achtergrondoperator &

Hiermee wordt de pijplijn op de achtergrond uitgevoerd in een PowerShell-taak. Deze operator werkt op dezelfde manier als de UNIX-besturingsoperator ampersand (&), die de opdracht voordat deze asynchroon in subshell als een taak uitvoert.

Deze operator is functioneel equivalent aan Start-Job. De achtergrondoperator start standaard de taken in de huidige werkmap van de aanroeper die de parallelle taken heeft gestart. In het volgende voorbeeld ziet u het basisgebruik van de operator voor de achtergrondtaak.

Get-Process -Name pwsh &

Deze opdracht is functioneel gelijk aan het volgende gebruik van Start-Job:

Start-Job -ScriptBlock {Get-Process -Name pwsh}

Net als Start-Job, retourneert de & achtergrondoperator een Job -object. Dit object kan worden gebruikt met Receive-Job en Remove-Job, net alsof u de taak hebt gestart Start-Job .

$job = Get-Process -Name pwsh &
Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Remove-Job $job

De & achtergrondoperator is ook een instructieeindteken, net als de UNIX-besturingsoperator en -teken (&). Hiermee kunt u extra opdrachten aanroepen na de & achtergrondoperator. In het volgende voorbeeld ziet u de aanroep van extra opdrachten na de & achtergrondoperator.

$job = Get-Process -Name pwsh & Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Dit is gelijk aan het volgende script:

$job = Start-Job -ScriptBlock {Get-Process -Name pwsh}
Receive-Job $job -Wait

Als u meerdere opdrachten wilt uitvoeren, elk in hun eigen achtergrondproces, maar allemaal op één regel, plaatst & u gewoon tussen en na elk van de opdrachten.

Get-Process -Name pwsh & Get-Service -Name BITS & Get-CimInstance -ClassName Win32_ComputerSystem &

Zie about_Jobs voor meer informatie over PowerShell-taken.

Cast-operator [ ]

Hiermee worden objecten geconverteerd of beperkt tot het opgegeven type. Als de objecten niet kunnen worden geconverteerd, genereert PowerShell een fout.

[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'

Een cast kan ook worden uitgevoerd wanneer een variabele wordt toegewezen aan met behulp van cast-notatie.

Kommaoperator ,

Als binaire operator maakt de komma een matrix of voegt deze toe aan de matrix die wordt gemaakt. In de expressiemodus maakt de komma als unaire operator een matrix met slechts één lid. Plaats de komma voor het lid.

$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)

Aangezien Write-Output een argument wordt verwacht, moet u de expressie tussen haakjes plaatsen.

Operator voor puntbronnen .

Voert een script uit in het huidige bereik, zodat alle functies, aliassen en variabelen die door het script worden gemaakt, worden toegevoegd aan het huidige bereik, waarbij bestaande worden overschreven. Parameters die door het script zijn gedeclareerd, worden variabelen. Parameters waarvoor geen waarde is opgegeven, worden variabelen zonder waarde. De automatische variabele $args blijft echter behouden.

. c:\scripts\sample.ps1 1 2 -Also:3

Notitie

De operator dot sourcing wordt gevolgd door een spatie. Gebruik de spatie om de punt te onderscheiden van het puntteken (.) dat de huidige map vertegenwoordigt.

In het volgende voorbeeld wordt het script Sample.ps1 in de huidige map uitgevoerd in het huidige bereik.

. .\sample.ps1

Indelingsoperator -f

Hiermee worden tekenreeksen opgemaakt met behulp van de indelingsmethode van tekenreeksobjecten. Voer de opmaaktekenreeks aan de linkerkant van de operator in en de objecten die moeten worden opgemaakt aan de rechterkant van de operator.

"{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
1 hello      3.14

U kunt een numerieke waarde met de aangepaste aanduiding '0' opgeven. Het aantal nullen na de : geeft de maximale breedte aan om de opgemaakte tekenreeks op te vullingen.

"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365

Als u de accolades ({}) in de opgemaakte tekenreeks wilt behouden, kunt u deze laten ontsnappen door de accolades te verdubbelen.

"{0} vs. {{0}}" -f 'foo'
foo vs. {0}

Zie de methode String.Format en Samengestelde opmaak voor meer informatie.

Indexoperator [ ]

Hiermee selecteert u objecten uit geïndexeerde verzamelingen, zoals matrices en hashtabellen. Matrixindexen zijn gebaseerd op nul, dus het eerste object wordt geïndexeerd als [0]. U kunt ook negatieve indexen gebruiken om de laatste waarden op te halen. Hash-tabellen worden geïndexeerd op sleutelwaarde.

Op basis van een lijst met indexen retourneert de indexoperator een lijst met leden die overeenkomen met die indexen.

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...

Wanneer een object geen geïndexeerde verzameling is, retourneert het object zelf als u de indexoperator gebruikt om toegang te krijgen tot het eerste element. Indexwaarden buiten het eerste element retourneren $null.

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

Pijplijnoperator |

Hiermee verzendt ('pipes') de uitvoer van de opdracht die eraan voorafgaat naar de opdracht die erop volgt. Wanneer de uitvoer meer dan één object bevat (een 'verzameling'), verzendt de pijplijnoperator de objecten één voor één.

Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}

Operators van pijplijnketens && en ||

Voer de pijplijn aan de rechterkant voorwaardelijk uit op basis van het succes van de pijplijn aan de linkerkant.

# If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad
# If npm install fails, the node_modules directory is removed
npm install || Remove-Item -Recurse ./node_modules

Zie About_Pipeline_Chain_Operators voor meer informatie.

Bereikoperator ..

De bereikoperator kan worden gebruikt om een matrix van opeenvolgende gehele getallen of tekens weer te geven. De waarden die door de bereikoperator worden samengevoegd, definiëren de begin- en eindwaarden van het bereik.

Notitie

Ondersteuning voor tekenbereiken is toegevoegd in PowerShell 6.

Getalbereiken

1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}

U kunt ook bereiken in omgekeerde volgorde maken.

10..1
5..-5 | ForEach-Object {Write-Output $_}

De begin- en eindwaarden van het bereik kunnen een paar expressies zijn die resulteren in een geheel getal of een teken. De eindpunten van het bereik moeten worden geconverteerd naar ondertekende 32-bits gehele getallen ([int32]). Grotere waarden veroorzaken een fout. Als het bereik wordt vastgelegd in een matrix, is de grootte van de resulterende matrix ook beperkt tot [int]::MaxValue - 56. Dit is de maximale grootte van een matrix in .NET.

U kunt bijvoorbeeld de leden van een opsomming gebruiken voor uw begin- en eindwaarden.

PS> enum Food {
      Apple
      Banana = 3
      Kiwi = 10
    }
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10

Belangrijk

Het resulterende bereik is niet beperkt tot de waarden van de opsomming. In plaats daarvan vertegenwoordigt het het bereik van waarden tussen de twee opgegeven waarden. U kunt de bereikoperator niet gebruiken om de leden van een opsomming betrouwbaar weer te geven.

Tekenbereiken

Als u een reeks tekens wilt maken, plaatst u de tekens tussen aanhalingstekens.

PS> 'a'..'f'
a
b
c
d
e
f
PS> 'F'..'A'
F
E
D
C
B
A

Als u een tekenbereik aan een tekenreeks toewijst, wordt deze hetzelfde behandeld als het toewijzen van een tekenmatrix aan een tekenreeks.

PS> [string]$s = 'a'..'e'
$s
a b c d e
$a = 'a', 'b', 'c', 'd', 'e'
$a
a b c d e

De tekens in de matrix worden samengevoegd tot een tekenreeks. De tekens worden gescheiden door de waarde van de $OFS voorkeursvariabele. Zie about_Preference_Variables voor meer informatie.

De volgorde van de tekens in de matrix wordt bepaald door de ASCII-waarde van het teken. De ASCII-waarden van c en X zijn bijvoorbeeld respectievelijk 99 en 88. Dit bereik wordt in omgekeerde volgorde weergegeven.

PS> 'c'..'X'
c
b
a
`
_
^
]
\
[
Z
Y
X

Operator voor lidtoegang .

Hiermee krijgt u toegang tot de eigenschappen en methoden van een object. De lidnaam kan een expressie zijn.

$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }

Wanneer u PowerShell 3.0 start en u de operator gebruikt voor een lijstverzamelingsobject dat het lid niet heeft, inventariseert PowerShell automatisch de items in die verzameling en wordt de operator voor elk van deze items gebruikt. Zie about_Member-Access_Enumeration voor meer informatie.

Operator statisch lid ::

Roept de statische eigenschappen en methoden van een .NET-klasse aan. Als u de statische eigenschappen en methoden van een object wilt vinden, gebruikt u de parameter Static van de Get-Member cmdlet. De lidnaam kan een expressie zijn.

[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }

Ternaire operator ? <if-true> : <if-false>

U kunt de ternaire operator gebruiken als vervanging voor de if-else instructie in eenvoudige voorwaardelijke gevallen.

Zie about_If voor meer informatie.

Operator null-coalescing ??

De operator ?? null-coalescing retourneert de waarde van de linkeroperand als deze niet null is. Anders wordt de rechteroperand geëvalueerd en wordt het resultaat geretourneerd. De ?? operator evalueert de rechteroperand niet als de linkeroperand niet null is.

$x = $null
$x ?? 100
100

In het volgende voorbeeld wordt de rechteroperand niet geëvalueerd.

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Toewijzingsoperator null-coalescing ??=

De toewijzingsoperator ??= null-coalescing wijst de waarde van de rechteroperand alleen toe aan de linkeroperand als de linkeroperand null is. De ??= operator evalueert de rechteroperand niet als de linkeroperand niet null is.

$x = $null
$x ??= 100
$x
100

In het volgende voorbeeld wordt de rechteroperand niet geëvalueerd.

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
$todaysDate
1/10/2020

Null-voorwaardelijke operators ?. en ?[]

Notitie

Deze functie is verplaatst van experimenteel naar basis in PowerShell 7.1.

Een voorwaardelijke operator null past een bewerking voor lidtoegang, ?., of elementtoegang, ?[], alleen toe op de operand als die operand als niet-null wordt geëvalueerd; anders wordt null geretourneerd.

Aangezien PowerShell deel kan ? uitmaken van de naam van de variabele, is formele specificatie van de variabelenaam vereist voor het gebruik van deze operators. U moet accolades ({}) gebruiken rond de namen van variabelen, zoals ${a} of wanneer ? deel uitmaakt van de naam ${a?}van de variabele .

Notitie

De syntaxis van de variabelenaam van ${<name>} mag niet worden verward met de $() operator subexpressie. Zie de sectie Variabelenaam van about_Variables voor meer informatie.

In het volgende voorbeeld wordt de waarde van PropName geretourneerd.

$a = @{ PropName = 100 }
${a}?.PropName
100

In het volgende voorbeeld wordt null geretourneerd zonder toegang te krijgen tot de lidnaam PropName.

$a = $null
${a}?.PropName

In dit voorbeeld wordt de waarde van het geïndexeerde element geretourneerd.

$a = 1..10
${a}?[0]
1

In het volgende voorbeeld wordt null geretourneerd zonder toegang te krijgen tot het geïndexeerde element.

$a = $null
${a}?[0]

Zie ook