Sdílet prostřednictvím


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

Poznámka:

Zabalení příkazu do závorek způsobí, že se automatická proměnná $? nastaví na $true, i když je uzavřený příkaz nastavený $? na $falsehodnotu . Například (Get-Item /Nosuch); $? neočekávaně vrátí hodnotu True. Další informace najdete v $?tématu about_Automatic_Variables.

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.

Výstupy těchto příkazů se například liší:

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'

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.

Například propojení výstupu z Get-ChildItem výstupu Rename-Item může mít neočekávané účinky, kdy se položka přejmenuje, pak se znovu zjistí a znovu přejmenuje.

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 skriptů. 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.
At line:1 char:2
+ & $c
+  ~~
    + CategoryInfo          : ObjectNotFound: (Get-Service -Name Spooler:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

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.
At line:1 char:2
+ & "1+1"
+  ~~~~~
    + CategoryInfo          : ObjectNotFound: (1+1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
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 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átor rozsahu ..

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

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 268435448 (nebo 256mb - 8). Toto je maximální velikost pole v rozhraní .NET Framework.

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.

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]:: $_ }

Viz také