Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 technologie .NET, který je implementuje, například: Int, String, DateTime, Hashtable a pole.
Bitové operátory (, , , , , ) 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.
Porovnávací operátory
K porovnání hodnot a podmínek testu použijte relační operátory (, , , , , ). 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 (, ) používají zástupné kóty jako a .
Operátory porovnání zahrnutí určují, zda se testovací hodnota vyskytuje v referenční sadě (, , , ).
Operátory porovnání typů (, ) určují, zda je objekt daného typu.
Další informace najdete v tématu about_Comparison_Operators.
Logické operátory
Pomocí logických operátorů (, , , , ) propojte podmíněné příkazy do jednoho komplexního podmíněného příkazu. Pomocí logického operátoru můžete například vytvořit filtr objektů 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í (, , , a ). Operátory přesměrování fungují podobně jako rutina (bez parametrů), ale také umožňují přesměrovat výstup chyby na zadané soubory. Výstup můžete přesměrovat také pomocí rutiny .
Další informace najdete v tématu about_Redirection
Operátory rozdělení a spojení
Operátory a rozdělují a kombinují podřetězece. Operátor rozdělí řetězec na podřetězce. Operátor 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ů
K vyhledání nebo technologie .NET změně typu objektu použijte operátory typu (-is, -isnot, -as).
Další informace najdete v tématu about_Type_Operators.
Unární operátory
Pomocí unárních operátorů a můžete zvýšit nebo dekrementovat hodnoty a pro negaci. Pokud chcete například zvýšit proměnné z na , zadáte .
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:
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. Napří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. Napří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 .
Toto chování platí pro všechny operátory přiřazení, včetně složených operátorů, jako jsou , a přírůstkové operátory () a dekrementace (). 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 před výstupem zvýší. V případě přípony se hodnota po výstupu zvýší.
Tuto techniku můžete použít také v kontextu podmíněného příkazu, jako je například příkaz.
if ($textFiles = Get-ChildItem *.txt) {
$textFiles.Count
}
Pokud se v tomto příkladu neshodují žádné soubory, příkaz nevrátí nic a nepřiřazuje nic , což je považováno za v logickém kontextu. Pokud je k objektu FileInfo přiřazen jeden nebo více objektů FileInfo, podmíněná hodnota se vyhodnotí jako . V textu příkazu můžete pracovat s hodnotou .
Note
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 ().
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 scriptblock. 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 skriptblocky. Operátor volání se spustí v podřízené oblasti. Další informace o oborech najdete v tématu about_Scopes. Můžete ho použít k sestavení řetězců obsahujících příkaz, parametry a argumenty, které potřebujete, a pak řetězec vyvolat, jako by to byl příkaz. Řetězce, které vytvoříte, musí dodržovat stejná pravidla analýzy jako příkaz, který zadáte na příkazovém řádku. Další informace najdete v tématu about_Parsing.
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 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 o blokování skriptů najdete v tématu about_Script_Blocks.
Operátor pozadí
Spustí kanál před ním na pozadí v úloze PowerShellu. Tento operátor funguje podobně jako operátor ovládacího prvku Unix ampersand (), který spouští příkaz před ním asynchronně v podshellu jako úloha.
Tento operátor je funkčně ekvivalentní . 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 použití :
Start-Job -ScriptBlock {Get-Process -Name pwsh}
Stejně jako vrátí operátor pozadí objekt . Tento objekt lze použít s a , stejně jako kdybyste k zahájení úlohy použili .
$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, stejně jako operátor ovládacího prvku Unix 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átor background.
$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ý ve vlastním 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átoru čá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, 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á se však zachová.
. C:\scripts\sample.ps1 1 2 -Also:3
Note
Za operátorem dot sourcing následuje mezera. Mezeru použijte k rozlišení tečky od symbolu tečky (), který představuje aktuální adresář.
V následujícím příkladu se Sample.ps1 skript v aktuálním adresáři spustí v aktuálním oboru.
. .\sample.ps1
Operátor formátu
Poskytněte přístup k funkci technologie .NET složeného formátování. Složený řetězec formátu se skládá z pevného textu intermixovaného s indexovanými zástupnými symboly, označovanými jako formátovat položky. Tyto položky formátu odpovídají objektům v seznamu.
Každá položka formátu má následující tvar a skládá se z následujících součástí:
{index[,alignment][:formatString]}
Jsou vyžadovány odpovídající složené závorky ( a ).
Operace formátování poskytuje výsledný řetězec, který se skládá z původního pevného textu intermixovaného s řetězcovou reprezentací objektů v seznamu. Další informace naleznete v tématu Složené formátování.
Zadejte řetězec složeného formátu na levé straně operátoru a objekty, které se mají naformátovat 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 za označuje maximální šířku, do které 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 závorky zdvojnásobíte.
"{0} vs. {{0}}" -f 'foo'
foo vs. {0}
Operátor indexu
Vybere objekty z indexovaných kolekcí, jako jsou pole a tabulky hash. Indexy polí jsou založené na nule, takže první objekt je indexován jako . 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 vrací .
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.
Note
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á čísla (). Větší hodnoty způsobují chybu. Pokud je oblast zachycena v matici, je velikost výsledné matice omezena na . Toto je maximální velikost pole v technologie .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
Important
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 proměnné předvoleb . Další informace najdete v části about_Preference_Variables.
Pořadí znaků v poli je určeno hodnotou ASCII znaku. Například hodnoty ASCII a jsou 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.
Pokud použijete operátor přístupu člena ke čtení vlastnosti, která neexistuje nebo když metoda getter vlastnosti vyvolá výjimku, PowerShell vrátí místo vyvolání chyby. Toto chování je specifické pro přístup k vlastnostem. Toto chování se řídí pravidlem certifikační autority technologie .NET CA1065 které uvádí:
Vlastnosti jsou v podstatě inteligentní pole. Proto by se měly chovat jako pole co nejvíce. Pole nevyvolají výjimky a ani by neměly mít vlastnosti. Pokud máte vlastnost, která vyvolá výjimku, zvažte vytvoření metody.
Výjimky vyvolané voláním metody (včetně přímého volání podkladové metody) nejsou potlačeny.
Operátor statického členu
Volá statické vlastnosti a metody třídy technologie .NET. Pokud chcete najít statické vlastnosti a metody objektu, použijte statický parametr rutiny . Název člena může být výraz.
[datetime]::Now
'MinValue', 'MaxValue' | ForEach-Object { [int]:: $_ }
Ternární operátor
Ternární operátor můžete použít jako náhradu za příkaz 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 jeho 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 zleva 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í nulového sjednocení
Operátor přiřazení s hodnotou null přiřadí hodnotu jeho 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 zleva 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
Note
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 použije přístup člena, nebo přístup elementu, , operace na jeho operand 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é. K názvům proměnných, jako jsou , nebo když je součástí názvu proměnné , je nutné použít složené závorky ().
Note
Syntaxe názvu proměnné by neměla být zaměňována s operátorem podvý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é
- about_Arithmetic_Operators
- about_Assignment_Operators
- about_Comparison_Operators
- about_Logical_Operators
- about_Operator_Precedence
- about_Member-Access_Enumeration
- about_Type_Operators
- about_Split
- about_Join
- about_Redirection