about_Operators

Kort beskrivning

Beskriver de operatorer som stöds av PowerShell.

Lång beskrivning

En operator är ett språkelement som du kan använda i ett kommando eller uttryck. PowerShell har stöd för flera typer av operatorer som hjälper dig att ändra värden.

Aritmetiska operatorer

Använd aritmetiska operatorer (+, -, *, /, %) för att beräkna värden i ett kommando eller uttryck. Med dessa operatorer kan du lägga till, subtrahera, multiplicera eller dividera värden och beräkna resten (modulus) av en divisionsåtgärd.

Additionsoperatorn sammanfogar element. Multiplikationsoperatorn returnerar det angivna antalet kopior av varje element. Du kan använda aritmetiska operatorer på valfri .NET-typ som implementerar dem, till exempel: Int, String, DateTime, Hashtableoch matriser.

Bitwiseoperatorer (-band, , -bor-bxor, -bnot, -shl, -shr) manipulerar bitmönstren i värden.

Mer information finns i about_Arithmetic_Operators.

Tilldelningsoperatorer

Använd tilldelningsoperatorer (=, +=, -=, *=, /=, %=) för att tilldela, ändra eller lägga till värden i variabler. Du kan kombinera aritmetiska operatorer med tilldelning för att tilldela resultatet av den aritmetiska åtgärden till en variabel.

Mer information finns i about_Assignment_Operators.

Jämförelseoperatörer

Använd jämförelseoperatorer (-eq, , -ne-gt, -lt, -le, ) -geför att jämföra värden och testvillkor. Du kan till exempel jämföra två strängvärden för att avgöra om de är lika med.

Jämförelseoperatorerna innehåller även operatorer som hittar eller ersätter mönster i text. Operatorerna (, , ) använder reguljära uttryck och (-like, -notlike) använder jokertecken *. -replace-notmatch-match

Operatorer för inneslutningsjämförelse avgör om ett testvärde visas i en referensuppsättning (-in, -notin, -contains, -notcontains).

Typjämförelseoperatorer (-is, -isnot) avgör om ett objekt är av en viss typ.

Mer information finns i about_Comparison_Operators.

Logiska operatörer

Använd logiska operatorer (-and, -or, -xor, -not, !) för att ansluta villkorssatser till en enda komplex villkorsstyrd. Du kan till exempel använda en logisk -and operator för att skapa ett objektfilter med två olika villkor.

Mer information finns i about_Logical_Operators.

Omdirigeringsoperatorer

Använd omdirigeringsoperatorer (>, >>, 2>, 2>>och 2>&1) för att skicka utdata från ett kommando eller uttryck till en textfil. Omdirigeringsoperatorerna fungerar som cmdleten Out-File (utan parametrar) men du kan också omdirigera felutdata till angivna filer. Du kan också använda cmdleten Tee-Object för att omdirigera utdata.

Mer information finns i about_Redirection

Dela upp och koppla operatorer

Operatorerna -split och -join delar upp och kombinerar delsträngar. Operatorn -split delar upp en sträng i delsträngar. Operatorn -join sammanfogar flera strängar till en enda sträng.

Mer information finns i about_Split och about_Join.

Typoperatorer

Använd typoperatorerna (-is, -isnot, -as) för att hitta eller ändra .NET-typen för ett objekt.

Mer information finns i about_Type_Operators.

Unary-operatorer

Använd unary ++ - och -- operatorerna för att öka eller minska värden och - för negation. Om du till exempel vill öka variabeln $a från 9 till 10skriver $a++du .

Mer information finns i about_Arithmetic_Operators.

Särskilda operatorer

Särskilda operatorer har specifika användningsfall som inte passar in i någon annan operatorgrupp. Med särskilda operatorer kan du till exempel köra kommandon, ändra ett värdes datatyp eller hämta element från en matris.

Grupperingsoperator ( )

Precis som i andra språk (...) åsidosätter du operatorprioretens i uttryck. Till exempel: (1 + 2) / 3

I PowerShell finns det dock ytterligare beteenden.

Gruppera resultatuttryck

(...) låter dig låta utdata från ett kommando delta i ett uttryck. Till exempel:

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

Grupperade piping-uttryck

När det används som det första segmentet i en pipeline, omsluter ett kommando eller uttryck inom parenteser orsakar alltid uppräkning av uttrycksresultatet. Om parenteserna omsluter ett kommando körs det till slut med alla utdata som samlas in i minnet innan resultatet skickas via pipelinen.

Genom att gruppera ett uttryck före rördragningen säkerställs också att efterföljande objekt-för-objekt-bearbetning inte kan störa den uppräkning som kommandot använder för att producera dess utdata.

Gruppering av tilldelningsuttryck

Ogrupperade tilldelningsuttryck matar inte ut värden. När du grupperar en tilldelningsinstruktor skickas värdet för den tilldelade variabeln igenom och kan användas i större uttryck. Till exempel:

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

Om du omsluter -instruktionen i parenteser omvandlas den till ett uttryck som matar ut värdet för $var.

Det här beteendet gäller för alla tilldelningsoperatorer, inklusive sammansatta operatorer som +=, och operatorerna increment (++) och decrement (--). Åtgärdsordningen för inkrement och minskning beror dock på deras position.

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

I prefixfallet ökas värdet $i för innan det matas ut. I postfixfallet ökas värdet $i för efter utdata.

Du kan också använda den här tekniken i kontexten för en villkorsstyrd instruktion, till exempel -instruktionen if .

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

I det här exemplet, om inga filer matchar, Get-ChildItem returnerar kommandot ingenting och tilldelar ingenting till $textFiles, vilket anses vara $false i en boolesk kontext. Om ett eller flera FileInfo-objekt tilldelas till $textFilesutvärderas villkoret till $true. Du kan arbeta med värdet $textFiles för i instruktionens if brödtext.

Kommentar

Även om den här tekniken är praktisk och koncis kan den leda till förvirring mellan tilldelningsoperatorn (=) och likhetsjämförelseoperatorn (-eq).

Underuttrycksoperator $( )

Returnerar resultatet av en eller flera instruktioner. För ett enda resultat returnerar en skalär. För flera resultat returnerar en matris. Använd detta när du vill använda ett uttryck i ett annat uttryck. Om du till exempel vill bädda in resultatet av kommandot i ett stränguttryck.

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

Matrisunderuttrycksoperator @( )

Returnerar resultatet av en eller flera instruktioner som en matris. Resultatet är alltid en matris med 0 eller fler objekt.

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

Literalsyntax för hashtabell @{}

På samma sätt som matrisunderuttryck används den här syntaxen för att deklarera en hash-tabell. Mer information finns i about_Hash_Tables.

Samtalsoperator &

Kör ett kommando, skript eller skriptblock. Med anropsoperatorn, även kallad anropsoperatorn, kan du köra kommandon som lagras i variabler och representeras av strängar eller skriptblock. Anropsoperatorn körs i ett underordnat omfång. Mer information om omfång finns i about_Scopes.

Det här exemplet lagrar ett kommando i en sträng och kör det med hjälp av anropsoperatorn.

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

Anropsoperatorn parsar inte strängar. Det innebär att du inte kan använda kommandoparametrar i en sträng när du använder anropsoperatorn.

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.

Cmdleten Invoke-Expression kan köra kod som orsakar parsningsfel när anropsoperatorn används.

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

Du kan köra ett skript med dess filnamn. En skriptfil måste ha ett .ps1 filnamnstillägg som kan köras. Filer som har blanksteg i sökvägen måste omges av citattecken. Om du försöker köra den citerade sökvägen visar PowerShell innehållet i den citerade strängen i stället för att köra skriptet. Med anropsoperatorn kan du köra innehållet i strängen som innehåller filnamnet.

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!

Mer information om skriptblock finns i about_Script_Blocks.

Bakgrundsoperator &

Kör pipelinen före den i bakgrunden i ett PowerShell-jobb. Den här operatorn fungerar på samma sätt som UNIX-kontrolloperatorn och (&), som kör kommandot innan det asynkront i underskal som ett jobb.

Den här operatorn är funktionellt likvärdig med Start-Job. Som standard startar bakgrundsoperatorn jobben i den aktuella arbetskatalogen för anroparen som startade de parallella uppgifterna. I följande exempel visas grundläggande användning av bakgrundsjobboperatorn.

Get-Process -Name pwsh &

Det kommandot är funktionellt likvärdigt med följande användning av Start-Job:

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

Precis som Start-Jobreturnerar bakgrundsoperatorn & ett Job objekt. Det här objektet kan användas med Receive-Job och Remove-Job, precis som om du hade använt Start-Job för att starta jobbet.

$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

Bakgrundsoperatorn & är också en instruktionsavslutare, precis som UNIX-kontrolloperatorn och (&). På så sätt kan du anropa ytterligare kommandon efter & bakgrundsoperatorn. I följande exempel visas anrop av ytterligare kommandon efter & bakgrundsoperatorn.

$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

Detta motsvarar följande skript:

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

Om du vill köra flera kommandon, var och en i sin egen bakgrundsprocess men alla på en rad, placerar & du helt enkelt mellan och efter vart och ett av kommandona.

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

Mer information om PowerShell-jobb finns i about_Jobs.

Gjuten operator [ ]

Konverterar eller begränsar objekt till den angivna typen. Om objekten inte kan konverteras genererar PowerShell ett fel.

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

En gjutning kan också utföras när en variabel tilldelas till att använda gjuten notation.

Kommaoperator ,

Som binär operator skapar kommatecknet en matris eller tillägg till matrisen som skapas. I uttrycksläge skapar kommatecknet som en unary-operator en matris med bara en medlem. Placera kommatecknet före medlemmen.

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

Eftersom Write-Output förväntar sig ett argument måste du placera uttrycket i parenteser.

Punktkällaoperator .

Kör ett skript i det aktuella omfånget så att alla funktioner, alias och variabler som skriptet skapar läggs till i det aktuella omfånget, vilket åsidosätter befintliga. Parametrar som deklareras av skriptet blir variabler. Parametrar för vilka inget värde har angetts blir variabler utan värde. Den automatiska variabeln $args bevaras dock.

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

Kommentar

Operatorn för punktkällor följs av ett blanksteg. Använd utrymmet för att skilja punkten från punktsymbolen (.) som representerar den aktuella katalogen.

I följande exempel körs Skriptet Sample.ps1 i den aktuella katalogen i det aktuella omfånget.

. .\sample.ps1

Formatoperator -f

Formaterar strängar med hjälp av formatmetoden för strängobjekt. Ange formatsträngen till vänster om operatorn och de objekt som ska formateras till höger om operatorn.

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

Du kan noll-pad ett numeriskt värde med den anpassade specificeraren "0". Antalet nollor som följer : anger den maximala bredden för att fylla på den formaterade strängen till.

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

Om du behöver behålla klammerparenteserna ({}) i den formaterade strängen kan du undvika dem genom att fördubbla klammerparenteserna.

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

Mer information finns i metoden String.Format och sammansatt formatering.

Indexoperator [ ]

Markerar objekt från indexerade samlingar, till exempel matriser och hash-tabeller. Matrisindex är nollbaserade, så det första objektet indexeras som [0]. Du kan också använda negativa index för att hämta de sista värdena. Hash-tabeller indexeras efter nyckelvärde.

Med en lista över index returnerar indexoperatorn en lista över medlemmar som motsvarar dessa index.

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

När ett objekt inte är en indexerad samling returneras själva objektet med hjälp av indexoperatorn för att komma åt det första elementet. Indexvärden utöver det första elementet returnerar $null.

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

Pipelineoperator |

Skickar ("pipes") utdata från kommandot som föregår det till kommandot som följer det. När utdata innehåller fler än ett objekt (en "samling" skickar pipelineoperatorn objekten ett i taget.

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

Pipelinekedjeoperatorer && och ||

Kör villkorligt pipelinen på höger sida baserat på att pipelinen på vänster sida lyckades.

# 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

Mer information finns i About_Pipeline_Chain_Operators.

Intervalloperator ..

Intervalloperatorn kan användas för att representera en matris med sekventiella heltal eller tecken. Värdena som är kopplade till intervalloperatorn definierar start- och slutvärdena för intervallet.

Kommentar

Stöd för teckenintervall har lagts till i PowerShell 6.

Talintervall

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

Du kan också skapa intervall i omvänd ordning.

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

Start- och slutvärdena för intervallet kan vara valfritt par med uttryck som utvärderas till ett heltal eller ett tecken. Slutpunkterna för intervallet måste konverteras till signerade 32-bitars heltal ([int32]). Större värden orsakar ett fel. Om intervallet samlas in i en matris är storleken på den resulterande matrisen begränsad till [int]::MaxValue - 56. Det här är den maximala storleken på en matris i .NET.

Du kan till exempel använda medlemmarna i en uppräkning för dina start- och slutvärden.

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

Viktigt!

Det resulterande intervallet är inte begränsat till uppräkningsvärdena. I stället representerar den intervallet med värden mellan de två angivna värdena. Du kan inte använda intervalloperatorn för att på ett tillförlitligt sätt representera medlemmarna i en uppräkning.

Teckenintervall

Om du vill skapa ett intervall med tecken omger du tecknen med citattecken.

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

Om du tilldelar ett teckenintervall till en sträng behandlas samma sak när du tilldelar en teckenmatris till en sträng.

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

Tecknen i matrisen är kopplade till en sträng. Tecknen avgränsas med värdet för $OFS inställningsvariabeln. Mer information finns i about_Preference_Variables.

Ordningen på tecknen i matrisen bestäms av ASCII-värdet för tecknet. Till exempel är ASCII-värdena c för och X 99 respektive 88. Det intervallet skulle presenteras i omvänd ordning.

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

Operator för medlemsåtkomst .

Åtkomst till egenskaperna och metoderna för ett objekt. Medlemsnamnet kan vara ett uttryck.

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

När du startar PowerShell 3.0, när du använder operatorn på ett listsamlingsobjekt som inte har medlemmen, räknar PowerShell automatiskt upp objekten i samlingen och använder operatorn på var och en av dem. Mer information finns i about_Member-Access_Enumeration.

Statisk medlemsoperator ::

Anropar statiska egenskaper och metoder för en .NET-klass. Om du vill hitta statiska egenskaper och metoder för ett objekt använder du parametern Static i cmdleten Get-Member . Medlemsnamnet kan vara ett uttryck.

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

Operatorn Ternary ? <if-true> : <if-false>

Du kan använda operatorn ternary som ersättning för -instruktionen if-else i enkla villkorsfall.

Mer information finns i about_If.

Operatorn Null-coalescing ??

Operatorn ?? null-coalescing returnerar värdet för dess vänstra operand om den inte är null. Annars utvärderas den högra operanden och dess resultat returneras. Operatorn ?? utvärderar inte sin högra operand om den vänstra operanden utvärderas till icke-null.

$x = $null
$x ?? 100
100

I följande exempel utvärderas inte den högra operanden.

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

Null-sammanslutande tilldelningsoperator ??=

Tilldelningsoperatorn ??= null-coalescing tilldelar endast värdet för sin högra operande till sin vänstra operande om den vänstra operanden utvärderas till null. Operatorn ??= utvärderar inte sin högra operand om den vänstra operanden utvärderas till icke-null.

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

I följande exempel utvärderas inte den högra operanden.

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

Null-villkorsstyrda operatorer ?. och ?[]

Kommentar

Den här funktionen har flyttats från experimentell till mainstream i PowerShell 7.1.

En null-villkorsoperator tillämpar endast en medlemsåtkomst, ?., eller elementåtkomst, ?[]på dess operand om operanden utvärderas till icke-null. Annars returneras null.

Eftersom PowerShell kan ? ingå i variabelnamnet krävs en formell specifikation av variabelnamnet för att använda dessa operatorer. Du måste använda klammerparenteser ({}) runt variabelnamn ${a} som eller när ? är en del av variabelnamnet ${a?}.

Kommentar

Syntaxen för ${<name>} variabelnamn för ska inte förväxlas med $() underuttrycksoperatorn. Mer information finns i avsnittet Variabelnamn i about_Variables.

I följande exempel returneras värdet för PropName .

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

Följande exempel returnerar null utan att försöka komma åt medlemsnamnet PropName.

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

I det här exemplet returneras värdet för det indexerade elementet.

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

Följande exempel returnerar null utan att försöka komma åt indexerade element.

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

Se även