about_Operators

Krótki opis

Opisuje operatory obsługiwane przez program PowerShell.

Długi opis

Operator jest elementem języka, którego można użyć w poleceniu lub wyrażeniu. Program PowerShell obsługuje kilka typów operatorów, które ułatwiają manipulowanie wartościami.

Operatory arytmetyczne

Użyj operatorów arytmetycznych (+, -, *, /%), aby obliczyć wartości w poleceniu lub wyrażeniu. Za pomocą tych operatorów można dodawać, odejmować, mnożyć lub dzielić wartości i obliczać resztę (modulo) operacji dzielenia.

Operator dodawania łączy elementy. Operator mnożenia zwraca określoną liczbę kopii każdego elementu. Operatory arytmetyczne można używać w dowolnym typie platformy .NET, które je implementują, na przykład: Int, String, DateTime, Hashtablei Tablice.

Operatory bitowe (-band, -bor, -bxor, -bnot, -shl, ) -shrmanipulują wzorcami bitów w wartościach.

Aby uzyskać więcej informacji, zobacz about_Arithmetic_Operators.

Operatory przypisania

Operatory przypisania (=, +=, -=, *=, /=, ), %=umożliwiają przypisywanie, zmienianie lub dołączanie wartości do zmiennych. Operatory arytmetyczne można połączyć z przypisaniem, aby przypisać wynik operacji arytmetycznej do zmiennej.

Aby uzyskać więcej informacji, zobacz about_Assignment_Operators.

Operatory porównania

Użyj operatorów porównania (-eq, -ne, , -gt-lt, -le, ), -geaby porównać wartości i warunki testowe. Można na przykład porównać dwie wartości ciągu, aby określić, czy są równe.

Operatory porównania obejmują również operatory, które znajdują lub zastępują wzorce w tekście. Operatory (, , ) używają wyrażeń regularnych, a (-like, -notlike) używają symboli wieloznacznych *. -replace-notmatch-match

Operatory porównania zawierania określają, czy wartość testowa pojawia się w zestawie odwołań (-in, -notin, -contains, -notcontains).

Operatory porównania typów (-is, ) określają, -isnotczy obiekt jest danego typu.

Aby uzyskać więcej informacji, zobacz about_Comparison_Operators.

Operatory logiczne

Użyj operatorów logicznych (-and, -or, -xor, -not, ), !aby połączyć instrukcje warunkowe z jednym złożonym warunkowym. Na przykład można użyć operatora logicznego -and , aby utworzyć filtr obiektu z dwoma różnymi warunkami.

Aby uzyskać więcej informacji, zobacz about_Logical_Operators.

Operatory przekierowania

Użyj operatorów przekierowania (>, >>, 2>, 2>>i 2>&1), aby wysłać dane wyjściowe polecenia lub wyrażenia do pliku tekstowego. Operatory przekierowania działają jak Out-File polecenie cmdlet (bez parametrów), ale umożliwiają również przekierowanie danych wyjściowych błędu do określonych plików. Możesz również użyć polecenia cmdlet do Tee-Object przekierowania danych wyjściowych.

Aby uzyskać więcej informacji, zobacz about_Redirection

Operatory podziału i sprzężenia

Operatory -split i -join dzielą i łączą podciągy. Operator -split dzieli ciąg na podciąg. Operator -join łączy wiele ciągów w jeden ciąg.

Aby uzyskać więcej informacji, zobacz about_Split i about_Join.

Operatory typów

Użyj operatorów typów (-is, -isnot, -as), aby znaleźć lub zmienić typ .NET Framework obiektu.

Aby uzyskać więcej informacji, zobacz about_Type_Operators.

Operatory jednoargumentowe

Użyj operatorów jednoargumentowych ++ i -- , aby zwiększać lub dekrementować wartości oraz - negację. Aby na przykład zwiększać zmienną $a z 9 do 10, należy wpisać $a++.

Aby uzyskać więcej informacji, zobacz about_Arithmetic_Operators.

Operatory specjalne

Specjalne operatory mają określone przypadki użycia, które nie mieszczą się w żadnej innej grupie operatorów. Na przykład specjalne operatory umożliwiają uruchamianie poleceń, zmienianie typu danych wartości lub pobieranie elementów z tablicy.

Operator grupowania ( )

Podobnie jak w innych językach, (...) służy do zastępowania pierwszeństwa operatora w wyrażeniach. Na przykład: (1 + 2) / 3

Jednak w programie PowerShell istnieją dodatkowe zachowania.

  • (...) Umożliwia umożliwienie danych wyjściowych polecenia uczestnictwa w wyrażeniu. Na przykład:

    PS> (Get-Item *.txt).Count -gt 10
    True
    
  • W przypadku użycia jako pierwszego segmentu potoku zawijanie polecenia lub wyrażenia w nawiasach niezmiennie powoduje wyliczenie wyniku wyrażenia. Jeśli nawiasy zawijają polecenie, jest ono uruchamiane do ukończenia ze wszystkimi danymi wyjściowymi zebranymi w pamięci przed wysłaniem wyników za pośrednictwem potoku.

Operator podwyrażu $( )

Zwraca wynik co najmniej jednej instrukcji. W przypadku pojedynczego wyniku zwraca wartość skalarną. W przypadku wielu wyników zwraca tablicę. Użyj tej funkcji, jeśli chcesz użyć wyrażenia w innym wyrażeniu. Aby na przykład osadzić wyniki polecenia w wyrażeniu ciągu.

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 podrażenia tablicy @( )

Zwraca wynik co najmniej jednej instrukcji jako tablicy. Wynik jest zawsze tablicą 0 lub więcej obiektów.

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

Składnia literału tabeli skrótu @{}

Podobnie jak w przypadku podrażenia tablicy, ta składnia służy do deklarowania tabeli skrótów. Aby uzyskać więcej informacji, zobacz about_Hash_Tables.

Operator wywołania &

Uruchamia polecenie, skrypt lub blok skryptu. Operator wywołania, znany również jako "operator wywołania", umożliwia uruchamianie poleceń przechowywanych w zmiennych i reprezentowanych przez ciągi lub bloki skryptu. Operator wywołania jest wykonywany w zakresie podrzędnym. Aby uzyskać więcej informacji na temat zakresów, zobacz about_Scopes.

W tym przykładzie polecenie jest przechowywane w ciągu i wykonuje je przy użyciu operatora wywołania.

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

Operator wywołania nie analizuje ciągów. Oznacza to, że nie można używać parametrów polecenia w ciągu podczas korzystania z operatora wywołania.

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.

Polecenie cmdlet Invoke-Expression może wykonać kod, który powoduje błędy analizowania podczas korzystania z operatora wywołania.

PS> & "1+1"
& : The term '1+1' 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
+ & "1+1"
+  ~~~~~
    + CategoryInfo          : ObjectNotFound: (1+1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
PS> Invoke-Expression "1+1"
2

Operator wywołania umożliwia wykonywanie skryptów przy użyciu ich nazw plików. W poniższym przykładzie przedstawiono nazwę pliku skryptu zawierającą spacje. Podczas próby wykonania skryptu program PowerShell zamiast tego wyświetla zawartość cytowanego ciągu zawierającego nazwę pliku. Operator wywołania umożliwia wykonanie zawartości ciągu zawierającego nazwę pliku.

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!

Aby uzyskać więcej informacji na temat bloków skryptów, zobacz about_Script_Blocks.

Operator tła &

Uruchamia potok przed nim w tle w zadaniu programu PowerShell. Ten operator działa podobnie do operatora sterowania UNIX ampersand (&), który uruchamia polecenie przed asynchronicznie w podshell jako zadanie.

Ten operator jest funkcjonalnie równoważny z Start-Job. Domyślnie operator w tle uruchamia zadania w bieżącym katalogu roboczym obiektu wywołującego, który uruchamia zadania równoległe. W poniższym przykładzie pokazano podstawowe użycie operatora zadania w tle.

Get-Process -Name pwsh &

To polecenie jest funkcjonalnie równoważne z następującym użyciem elementu Start-Job:

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

Podobnie jak Start-Job& operator tła zwraca Job obiekt . Tego obiektu można używać z elementami Receive-Job i Remove-Job, tak jak w przypadku użycia do Start-Job uruchomienia zadania.

$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

& Operator tła jest również terminatorem instrukcji, podobnie jak operator sterowania UNIX i (&). Dzięki temu można wywołać dodatkowe polecenia po operatorze & tła. W poniższym przykładzie pokazano wywołanie dodatkowych poleceń po & operatorze w tle.

$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

Jest to odpowiednik następującego skryptu:

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

Jeśli chcesz uruchomić wiele poleceń, każdy w ich własnym procesie w tle, ale wszystkie w jednym wierszu, po prostu umieść & między i po każdym z poleceń.

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

Aby uzyskać więcej informacji na temat zadań programu PowerShell, zobacz about_Jobs.

Operator rzutowania [ ]

Konwertuje lub ogranicza obiekty do określonego typu. Jeśli nie można przekonwertować obiektów, program PowerShell generuje błąd.

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

Rzutowanie można również wykonać, gdy zmienna jest przypisana do przy użyciu notacji rzutowania.

Operator przecinka ,

Jako operator binarny przecinek tworzy tablicę lub dołącza do tworzonej tablicy. W trybie wyrażenia jako operator jednoargumentowy przecinek tworzy tablicę z tylko jednym elementem członkowskim. Umieść przecinek przed elementem członkowskim.

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

Ponieważ Write-Object oczekuje argumentu, należy umieścić wyrażenie w nawiasach.

Operator określania kropki .

Uruchamia skrypt w bieżącym zakresie, aby wszystkie funkcje, aliasy i zmienne tworzone przez skrypt zostały dodane do bieżącego zakresu, przesłaniając istniejące. Parametry zadeklarowane przez skrypt stają się zmiennymi. Parametry, dla których nie podano żadnej wartości, stają się zmiennymi bez wartości. Jednak zmienna $args automatyczna jest zachowywana.

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

Uwaga

Operator określania kropki następuje spacją. Użyj spacji, aby odróżnić kropkę od symbolu kropki (.), który reprezentuje bieżący katalog.

W poniższym przykładzie skrypt Sample.ps1 w bieżącym katalogu jest uruchamiany w bieżącym zakresie.

. .\sample.ps1

Operator formatu -f

Formatuje ciągi przy użyciu metody formatowania obiektów ciągów. Wprowadź ciąg formatu po lewej stronie operatora i obiekty, które mają być sformatowane po prawej stronie operatora.

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

Jeśli musisz zachować nawiasy klamrowe ({}) w sformatowanych ciągach, możesz je uciec, podwajając nawiasy klamrowe.

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

Aby uzyskać więcej informacji, zobacz metodę String.Format i formatowanie złożone.

Operator indeksu [ ]

Wybiera obiekty z indeksowanych kolekcji, takich jak tablice i tabele skrótów. Indeksy tablic są oparte na zera, więc pierwszy obiekt jest indeksowany jako [0]. Możesz również użyć indeksów ujemnych, aby uzyskać ostatnie wartości. Tabele skrótów są indeksowane według wartości klucza.

Biorąc pod uwagę listę indeksów, operator indeksu zwraca listę elementów członkowskich odpowiadających tym indeksom.

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

Gdy obiekt nie jest indeksowaną kolekcją, użyj operatora indeksu, aby uzyskać dostęp do pierwszego elementu, zwraca sam obiekt. Wartości indeksu wykraczające poza pierwszy element zwracają $nullwartość .

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

Operator potoku |

Wysyła ("potoki") dane wyjściowe polecenia, które poprzedza je do następującego polecenia. Gdy dane wyjściowe zawierają więcej niż jeden obiekt (kolekcja), operator potoku wysyła obiekty pojedynczo.

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

Operatory łańcucha potoków && i ||

Warunkowo wykonaj potok po prawej stronie w oparciu o powodzenie potoku po lewej stronie.

# 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

Aby uzyskać więcej informacji, zobacz About_Pipeline_Chain_Operators.

Operator zakresu ..

Reprezentuje sekwencyjne liczby całkowite w tablicy całkowitej, biorąc pod uwagę górną i dolną granicę.

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

Zakresy można również tworzyć w odwrotnej kolejności.

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

Począwszy od programu PowerShell 6, operator zakresu współpracuje z znakami , a także liczbami całkowitymi.

Aby utworzyć zakres znaków, należy ująć znaki granic w cudzysłowie.

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

Operator dostępu do elementów członkowskich .

Uzyskuje dostęp do właściwości i metod obiektu. Nazwa elementu członkowskiego może być wyrażeniem.

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

Począwszy od programu PowerShell 3.0, gdy używasz operatora w obiekcie kolekcji list, który nie ma elementu członkowskiego, program PowerShell automatycznie wylicza elementy w tej kolekcji i używa operatora na każdym z nich. Aby uzyskać więcej informacji, zobacz about_Member-Access_Enumeration.

Operator statycznego elementu członkowskiego ::

Wywołuje właściwości statyczne i metody klasy .NET Framework. Aby znaleźć właściwości statyczne i metody obiektu, użyj parametru Get-Member Static polecenia cmdlet. Nazwa elementu członkowskiego może być wyrażeniem.

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

Operatorternary ? <if-true> : <if-false>

Operatorternary można użyć jako zamiennik instrukcji if-else w prostych przypadkach warunkowych.

Aby uzyskać więcej informacji, zobacz about_If.

Operator łączenia wartości null ??

Operator ?? łączenia wartości null zwraca wartość operandu po lewej stronie, jeśli nie ma wartości null. W przeciwnym razie oblicza operand po prawej stronie i zwraca jego wynik. Operator ?? nie ocenia operandu po prawej stronie, jeśli operand po lewej stronie ocenia wartość inną niż null.

$x = $null
$x ?? 100
100

W poniższym przykładzie operand po prawej stronie nie zostanie oceniony.

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

Operator przypisania łączenia wartości null ??=

Operator ??= przypisania o wartości null przypisuje wartość operandu po prawej stronie do operandu po lewej stronie tylko wtedy, gdy operand po lewej stronie ma wartość null. Operator ??= nie ocenia operandu po prawej stronie, jeśli operand po lewej stronie ocenia wartość inną niż null.

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

W poniższym przykładzie operand po prawej stronie nie zostanie oceniony.

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

Operatory warunkowe ?. o wartości null i ?[]

Uwaga

Ta funkcja została przeniesiona z eksperymentalnego do głównego nurtu w programie PowerShell 7.1.

Operator warunkowy o wartości null stosuje dostęp do elementu członkowskiego, ?.lub dostęp do elementu, operację do operandu tylko wtedy, ?[]gdy operand ocenia wartość inną niż null; w przeciwnym razie zwraca wartość null.

Ponieważ program PowerShell może ? być częścią nazwy zmiennej, do korzystania z tych operatorów wymagana jest formalna specyfikacja nazwy zmiennej. Dlatego należy używać {} wokół nazw zmiennych, takich jak ${a} lub gdy ? jest częścią nazwy ${a?}zmiennej .

W poniższym przykładzie zwracana jest wartość PropName .

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

Poniższy przykład zwróci wartość null bez próby uzyskania dostępu do nazwy elementu członkowskiego PropName.

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

Podobnie zostanie zwrócona wartość elementu.

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

A gdy operand ma wartość null, element nie jest dostępny i zwracany jest wartość null.

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

Uwaga

Ponieważ program PowerShell może ? być częścią nazwy zmiennej, do korzystania z tych operatorów wymagana jest formalna specyfikacja nazwy zmiennej. Dlatego należy używać {} wokół nazw zmiennych, takich jak ${a} lub gdy ? jest częścią nazwy ${a?}zmiennej .

Składnia nazwy zmiennej ${<name>} nie powinna być mylona z operatorem $() subexpression. Aby uzyskać więcej informacji, zobacz sekcję Nazwa zmiennej about_Variables.

Zobacz też