about_Operators

Krátký popis

Popisuje operátory podporované prostředím PowerShell.

Dlouhý popis

Operátor je prvek jazyka, který můžete použít v příkazu nebo výrazu. PowerShell podporuje několik typů operátorů, které vám pomůžou pracovat s hodnotami.

Aritmetické operátory

K výpočtu hodnot v příkazu nebo výrazu použijte aritmetické operátory (+, -, */, ). % Pomocí těchto operátorů můžete sčítat, odčítat, násobit nebo dělit hodnoty a vypočítat zbytek (moduly) operace dělení.

Operátor sčítání zřetězí prvky. Operátor násobení vrátí zadaný počet kopií každého prvku. Aritmetické operátory můžete použít u libovolného typu .NET, který je implementuje, například: Int, String, DateTime, Hashtablea pole.

Bitové operátory (-band, , -bxor-bor, -bnot, -shl, -shr) manipulují s bity v hodnotách.

Další informace najdete v tématu about_Arithmetic_Operators.

Operátory přiřazení

Pomocí operátorů přiřazení (=, , +=, *=-=, /=, %=) přiřaďte, změňte nebo připojte hodnoty k proměnným. Aritmetické operátory můžete kombinovat s přiřazením k přiřazení výsledku aritmetické operace proměnné.

Další informace najdete v tématu about_Assignment_Operators.

Operátory porovnání

K porovnání hodnot a testovacích podmínek použijte relační operátory (-eq, -ne, -gt-lt, -le-ge). Můžete například porovnat dvě řetězcové hodnoty a určit, jestli jsou stejné.

Operátory porovnání také zahrnují operátory, které v textu vyhledá nebo nahrazují vzory. Operátory (, , ) používají regulární výrazy a (-like, -notlike) používají zástupné cardy *. -replace-notmatch-match

Operátory porovnání zahrnutí určují, zda se testovací hodnota vyskytuje v referenční sadě (-in, -notin, -contains, -notcontains).

Operátory porovnání typů (-is, ) určují, -isnotzda je objekt daného typu.

Další informace najdete v tématu about_Comparison_Operators.

Logické operátory

Pomocí logických operátorů (-and, , -or-xor, -not, !) propojte podmíněné příkazy do jediného složitého podmíněného příkazu. Pomocí logického -and operátoru můžete například vytvořit filtr objektu se dvěma různými podmínkami.

Další informace najdete v tématu about_Logical_Operators.

Operátory přesměrování

K odeslání výstupu příkazu nebo výrazu do textového souboru použijte operátory přesměrování (>, >>, 2>, 2>>, a 2>&1) . Operátory přesměrování fungují podobně jako rutina Out-File (bez parametrů), ale umožňují také přesměrování výstupu chyby na zadané soubory. Výstup můžete přesměrovat také pomocí Tee-Object rutiny.

Další informace najdete v tématu about_Redirection

Operátory rozdělení a spojení

Operátory -split a -join operátory rozdělují a kombinují podřetězece. Operátor -split rozdělí řetězec na podřetězce. Operátor -join zřetězí více řetězců do jednoho řetězce.

Další informace najdete v tématu about_Split a about_Join.

Operátory typů

Pomocí operátorů typu (-is, -isnot, -as) vyhledejte nebo změňte typ .NET objektu.

Další informace najdete v tématu about_Type_Operators.

Unární operátory

Pomocí unárních ++ operátorů a -- operátorů můžete zvýšit nebo dekrementovat hodnoty a - negace. Chcete-li například zvýšit proměnnou $a z 9 na 10, zadáte $a++.

Další informace najdete v tématu about_Arithmetic_Operators.

Speciální operátory

Speciální operátory mají konkrétní případy použití, které se nevejdou do žádné jiné skupiny operátorů. Například speciální operátory umožňují spouštět příkazy, měnit datový typ hodnoty nebo načítat prvky z pole.

Operátor seskupení ( )

Stejně jako v jiných jazycích (...) slouží k přepsání priority operátorů ve výrazech. Příklad: (1 + 2) / 3

V PowerShellu ale existují další chování.

Seskupování výsledných výrazů

(...)umožňuje povolit výstup příkazu, který se účastní výrazu. Příklad:

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

Seskupené výrazy

Pokud se používá jako první segment kanálu, zabalení příkazu nebo výrazu do závorek vždy způsobí výčet výsledku výrazu. Pokud závorky zabalí příkaz, spustí se dokončení se všemi výstupy shromážděnými v paměti před odesláním výsledků prostřednictvím kanálu.

Seskupením výrazu před propojením také zajistíte, že následné zpracování objektu po objektu nemůže kolidovat s výčtem, který příkaz použije k vytvoření výstupu.

Seskupování příkazů přiřazení

Neseskupené příkazy přiřazení nemají výstupní hodnoty. Při seskupování příkazu přiřazení se předá hodnota přiřazené proměnné a dá se použít ve větších výrazech. Příklad:

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

Zabalení příkazu do závorek ho změní na výraz, který vypíše hodnotu $var.

Toto chování platí pro všechny operátory přiřazení, včetně složených operátorů, jako jsou +=, a inkrementace (++) a dekrementace (--) operátorů. Pořadí operací přírůstku a dekrementace však závisí na jejich pozici.

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

V případě předpony se hodnota $i inkrementuje před výstupem. V případě přípony se hodnota $i po výstupu zvýší.

Tuto techniku můžete použít také v kontextu podmíněného příkazu, jako je například if příkaz.

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

Pokud se v tomto příkladu Get-ChildItem neshodují žádné soubory, příkaz nevrátí nic a nepřiřazuje nic $textFiles, který je považován $false za logický kontext. Pokud je k objektu FileInfo přiřazen $textFilesjeden nebo více objektů FileInfo, podmíněná hodnota se vyhodnotí jako $true. Můžete pracovat s hodnotou $textFiles v textu if příkazu.

Poznámka:

I když je tato technika pohodlná a stručná, může vést k nejasnostem mezi operátorem přiřazení (=) a operátorem porovnání rovnosti (-eq).

Operátor dílčího výrazu $( )

Vrátí výsledek jednoho nebo více příkazů. Pro jeden výsledek vrátí skalár. Pro více výsledků vrátí pole. Tuto možnost použijte, pokud chcete použít výraz v jiném výrazu. Pokud chcete například vložit výsledky příkazu do řetězcového výrazu.

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

Operátor dílčího výrazu pole @( )

Vrátí výsledek jednoho nebo více příkazů jako pole. Výsledkem je vždy pole 0 nebo více 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

Syntaxe literálu tabulky hash @{}

Podobně jako u dílčího výrazu pole se tato syntaxe používá k deklaraci tabulky hash. Další informace najdete v tématu about_Hash_Tables.

Operátor volání &

Spustí příkaz, skript nebo blok skriptu. Operátor volání, označovaný také jako "operátor vyvolání", umožňuje spouštět příkazy uložené v proměnných a reprezentované řetězci nebo bloky skriptu. Operátor volání se spustí v podřízené oblasti. Další informace o oborech najdete v tématu about_Scopes.

Tento příklad uloží příkaz do řetězce a spustí ho pomocí operátoru volání.

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

Operátor volání neanalyzuje řetězce. To znamená, že při použití operátoru volání nemůžete použít parametry příkazů v řetězci.

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.

Rutina Invoke-Expression může spouštět kód, který způsobí chyby analýzy při použití operátoru volání.

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

Skript můžete spustit pomocí názvu souboru. Aby byl soubor skriptu spustitelný, musí mít příponu .ps1 souboru. Soubory, které mají v cestě mezery, musí být uzavřeny v uvozovkách. Pokud se pokusíte spustit cestu v uvozování, PowerShell místo spuštění skriptu zobrazí obsah uvozového řetězce. Operátor volání umožňuje spustit obsah řetězce obsahujícího název souboru.

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!

Další informace obloch about_Script_Blocks ch

Operátor pozadí &

Spustí kanál před ním na pozadí v úloze PowerShellu. Tento operátor funguje podobně jako systém UNIX řídicí operátor ampersand (&), který spouští příkaz před asynchronně v podshellu jako úlohu.

Tento operátor je funkčně ekvivalentní .Start-Job Ve výchozím nastavení operátor pozadí spustí úlohy v aktuálním pracovním adresáři volajícího, který spustil paralelní úlohy. Následující příklad ukazuje základní použití operátoru úlohy na pozadí.

Get-Process -Name pwsh &

Tento příkaz je funkčně ekvivalentní následujícímu Start-Jobpoužití:

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

Stejně jako Start-Job& operátor pozadí vrátí Job objekt. Tento objekt lze použít s Receive-Job a Remove-Job, stejně jako kdybyste použili Start-Job ke spuštění úlohy.

$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

Operátor & pozadí je také ukončovacím znakem příkazu, stejně jako systém UNIX ovládací operátor ampersand (&). To vám umožní vyvolat další příkazy za operátorem & pozadí. Následující příklad ukazuje vyvolání dalších příkazů za operátorem & pozadí.

$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

Toto je ekvivalentem následujícího skriptu:

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

Pokud chcete spustit více příkazů, každý v rámci vlastního procesu na pozadí, ale všechny na jednom řádku, jednoduše umístěte & mezi a za každou z těchto příkazů.

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

Další informace o úlohách PowerShellu najdete v tématu about_Jobs.

Operátor přetypování [ ]

Převede nebo omezí objekty na zadaný typ. Pokud objekty nejde převést, PowerShell vygeneruje chybu.

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

Přetypování lze provést také v případech, kdy je proměnná přiřazena k použití zápisu přetypování.

Operátor čárky ,

Jako binární operátor vytvoří čárka matici nebo připojí k vytvářené matici. V režimu výrazu jako unární operátor vytvoří čárka pole pouze s jedním členem. Před člena umístěte čárku.

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

Vzhledem k tomu Write-Output , že očekává argument, musíte výraz vložit do závorek.

Operátor dot sourcing .

Spustí skript v aktuálním oboru tak, aby všechny funkce, aliasy a proměnné, které skript vytvoří, byly přidány do aktuálního oboru a přepisovat existující. Parametry deklarované skriptem se stanou proměnnými. Parametry, pro které nebyla zadána žádná hodnota, se stanou proměnnými bez hodnoty. Automatická proměnná $args se však zachová.

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

Poznámka:

Za operátorem dot sourcing následuje mezera. Mezeru použijte k odlišení tečky od symbolu tečky (.), který představuje aktuální adresář.

V následujícím příkladu se skript Sample.ps1 v aktuálním adresáři spustí v aktuálním oboru.

. .\sample.ps1

Operátor formátu -f

Formátuje řetězce pomocí metody formátu řetězcových objektů. Zadejte formátovací řetězec na levé straně operátoru a objekty, které mají být formátovány na pravé straně operátoru.

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

Číselnou hodnotu můžete nulovat pomocí vlastního specifikátoru "0". Počet nul následujících za znakem : určuje maximální šířku, na které se má formátovaný řetězec vložit.

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

Pokud potřebujete zachovat složené závorky ({}) ve formátovaného řetězci, můžete je utéct tak, že složených závorek zdvojnásobíte.

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

Další informace naleznete v String.Format metoda a složené formátování.

Operátor indexu [ ]

Vybere objekty z indexovaných kolekcí, jako jsou pole a tabulky hash. Indexy pole jsou založené na nule, takže první objekt je indexován jako [0]. K získání posledních hodnot můžete použít také záporné indexy. Tabulky hash se indexují podle hodnoty klíče.

Operátor indexu vrátí seznam členů odpovídajících těmto indexům.

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

Pokud objekt není indexovanou kolekcí, vrátí použití operátoru indexu pro přístup k prvnímu prvku samotný objekt. Hodnoty indexu nad rámec prvního prvku vrátí $null.

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

Operátor kanálu |

Odešle ("kanály") výstup příkazu, který ho předchází příkazu, který ho následuje. Pokud výstup obsahuje více než jeden objekt ("kolekce"), operátor kanálu odešle objekty po jednom.

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

Operátory && řetězu kanálů a ||

Podmíněně spusťte kanál na pravé straně na základě úspěchu kanálu na levé straně.

# 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

Další informace najdete v tématu About_Pipeline_Chain_Operators.

Operátor rozsahu ..

Operátor rozsahu lze použít k reprezentaci pole sekvenčních celých čísel nebo znaků. Hodnoty spojené operátorem rozsahu definují počáteční a koncové hodnoty oblasti.

Poznámka:

Podpora rozsahů znaků byla přidána v PowerShellu 6.

Rozsahy čísel

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

Můžete také vytvořit rozsahy v obráceném pořadí.

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

Počáteční a koncové hodnoty rozsahu mohou být libovolnou dvojicí výrazů, které se vyhodnotí jako celé číslo nebo znak. Koncové body rozsahu musí být konvertibilní na 32bitové celé číslo ([int32]). Větší hodnoty způsobují chybu. Pokud je oblast zachycena v matici, je velikost výsledné matice omezena na [int]::MaxValue - 56. Toto je maximální velikost pole v .NET.

Můžete například použít členy výčtu pro počáteční a koncové hodnoty.

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

Důležité

Výsledný rozsah není omezen na hodnoty výčtu. Místo toho představuje rozsah hodnot mezi zadanými dvěma hodnotami. Operátor rozsahu nelze použít ke spolehlivému znázornění členů výčtu.

Rozsahy znaků

Pokud chcete vytvořit rozsah znaků, uzavřete znaky do uvozovek.

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

Pokud přiřadíte rozsah znaků řetězci, bude se zacházet se stejným přiřazením pole znaků k řetězci.

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

Znaky v poli jsou spojeny do řetězce. Znaky jsou odděleny hodnotou $OFS proměnné předvoleb. Další informace najdete v tématu about_Preference_Variables.

Pořadí znaků v poli je určeno hodnotou ASCII znaku. Například hodnoty ASCII jsou cX 99 a 88. Tento rozsah by se zobrazil v obráceném pořadí.

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

Operátor přístupu člena .

Přistupuje k vlastnostem a metodám objektu. Název člena může být výraz.

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

Při spuštění PowerShellu 3.0 použijete operátor u objektu kolekce seznamů, který nemá člena, PowerShell automaticky vypíše položky v této kolekci a použije na každém z nich operátor. Další informace najdete v tématu about_Member-Access_Enumeration.

Operátor statického členu ::

Volá statické vlastnosti a metody třídy .NET. Pokud chcete najít statické vlastnosti a metody objektu, použijte statický parametr rutiny Get-Member . Název člena může být výraz.

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

Ternární operátor ? <if-true> : <if-false>

Ternární operátor můžete použít jako náhradu if-else příkazu v jednoduchých podmíněných případech.

Další informace najdete v tématu about_If.

Operátor nulového sjednocení ??

Operátor ?? nulového sjednocení vrátí hodnotu levého operandu, pokud není null. V opačném případě vyhodnocuje pravý operand a vrátí výsledek. Operátor ?? nevyhodnocuje jeho operand zprava, pokud se operand vlevo vyhodnotí jako nenulový.

$x = $null
$x ?? 100
100

V následujícím příkladu nebude vyhodnocen pravý operand.

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

Operátor přiřazení při sjednocení s hodnotou null ??=

Operátor přiřazení přiřazení ??= s hodnotou null přiřazuje hodnotu svého operandu zprava do levého operandu pouze v případě, že se operand vlevo vyhodnotí jako null. Operátor ??= nevyhodnocuje jeho operand zprava, pokud se operand vlevo vyhodnotí jako nenulový.

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

V následujícím příkladu nebude vyhodnocen pravý operand.

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

Podmíněné operátory ?. s hodnotou Null a ?[]

Poznámka:

Tato funkce byla přesunuta z experimentálního do hlavního proudu v PowerShellu 7.1.

Podmíněný operátor s hodnotou null aplikuje na svůj operand operaci přístup člena nebo ?.elementu ?[]pouze v případě, že se tento operand vyhodnotí jako nenulový. V opačném případě vrátí hodnotu null.

Vzhledem k tomu, že PowerShell umožňuje ? být součástí názvu proměnné, je pro použití těchto operátorů vyžadována formální specifikace názvu proměnné. Je nutné použít složené závorky ({}) kolem názvů proměnných, například ${a} nebo pokud ? je součástí názvu ${a?}proměnné .

Poznámka:

Syntaxe názvu proměnné by neměla být zaměňována s operátorem dílčího ${<name>} výrazu $() . Další informace naleznete v části Název proměnné about_Variables.

V následujícím příkladu se vrátí hodnota PropName .

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

Následující příklad vrátí hodnotu null bez pokusu o přístup k názvu člena PropName.

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

V tomto příkladu se vrátí hodnota indexovaného prvku.

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

Následující příklad vrátí hodnotu null bez pokusu o přístup k indexovaného prvku.

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

Viz také