about_Operators

Krótki opis

Opisuje operatory obsługiwane przez program PowerShell.

Długi opis

Operator to element języka, który może być używany 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 oraz obliczać resztę (modulo) operacji dzielenia.

Operator dodawania łączy elementy. Operator mnożenia zwraca określoną liczbę kopii każdego elementu. Operatorów arytmetycznych można używać w dowolnym typie .NET, który je implementuje, takim jak: Int, String, DateTime, , Hashtablei Tablice.

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

Aby uzyskać więcej informacji, zobacz about_Arithmetic_Operators.

Operatory przypisania

Operatory przypisania (=, , +=, *=``-=, /=, %=) są przeznaczone do przypisywania, zmieniania lub dołączania 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, , -lt``-gt, -le, -ge), aby 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ływać (-in, -notin, -contains, -notcontains).

Operatory porównania typów (-is, -isnot) określają, czy 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 pojedynczym 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 Tee-Object cmdlet , aby przekierować dane wyjściowe.

Aby uzyskać więcej informacji, zobacz about_Redirection

Operatory podziału i sprzężenia

Operatory -split i -join dzielą i łączą podciągi. Operator -split dzieli ciąg na podciągi. 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 .NET Framework typu obiektu.

Aby uzyskać więcej informacji, zobacz about_Type_Operators.

Operatory unary

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

Aby uzyskać więcej informacji, zobacz about_Arithmetic_Operators.

Operatory specjalne

Operatory specjalne 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 operatorów w wyrażeniach. Na przykład: (1 + 2) / 3

Jednak w programie PowerShell istnieją dodatkowe zachowania.

  • (...) Umożliwia, aby dane wyjściowe z polecenia uczestniczyć w wyrażeniu. Na przykład:

    PS> (Get-Item *.txt).Count -gt 10
    True
    
  • Gdy jest używany jako pierwszy segment potoku, zawijanie polecenia lub wyrażenia w nawiasy niezmiennie powoduje wyliczenie wyniku wyrażenia. Jeśli nawiasy zawijają polecenie, jest ono uruchamiane do ukończenia z wszystkimi danych wyjściowych zebranych w pamięci, zanim wyniki zostaną wysłane przez potok.

Operator podwyraższe $( )

Zwraca wynik co najmniej jednej instrukcji. W przypadku pojedynczego wyniku zwraca wartość skalarną. W przypadku wielu wyników funkcja zwraca tablicę. Użyj tego wyrażenia, jeśli chcesz użyć wyrażenia w innym wyrażeniu. Na przykład aby 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 podwyraższe 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ótów @{}

Podobnie jak w podwyrażce 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ń, które są przechowywane w zmiennych i reprezentowane przez ciągi lub bloki skryptów. Operator wywołania jest wykonywany w zakresie podrzędnym. Aby uzyskać więcej informacji o zakresach, zobacz about_Scopes.

W tym przykładzie polecenie jest przechowywane w ciągu i wykonywane 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 analizy 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 pokazano nazwę pliku skryptu, który zawiera spacje. Podczas próby wykonania skryptu program PowerShell wyświetla zawartość w cudzysłowy ciąg zawierający 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 system UNIX sterowania ampersand (&), który uruchamia polecenie przed nim asynchronicznie w podsieć jako zadanie.

Ten operator jest funkcjonalnie odpowiednikiem .Start-Job Domyślnie operator w tle uruchamia zadania w bieżącym katalogu roboczy wywołującego, który uruchomił 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 następujące użycie polecenia Start-Job:

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

Podobnie jak Start-Joboperator & tła zwraca Job obiekt . Tego obiektu można używać z obiektami Receive-Job i Remove-Job, Start-Job tak jak w przypadku 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 system UNIX kontrolki ampersand (&). Dzięki temu można wywoływać dodatkowe polecenia po operatorze & w tle. W poniższym przykładzie pokazano wywołania 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 równoważne następującej skrypcie:

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

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

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 przecinkowy ,

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

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

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

Operator pozyskiwania kropek .

Uruchamia skrypt w bieżącym zakresie, tak aby wszystkie funkcje, aliasy i zmienne, które tworzy skrypt, zostały dodane do bieżącego zakresu, zastępują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. Automatyczna zmienna jest jednak $args zachowywana.

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

Uwaga

Po operatorze pozyskiwania kropki następuje spacja. Użyj spacji, aby odróżnić kropkę (.) reprezentującą 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 do sformatowania po prawej stronie operatora.

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

Jeśli chcesz zachować nawiasy klamrowe ({}) w sformatowanym ciągu, możesz je zmienić, podwajając nawiasy klamrowe.

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

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

Operator indeksu [ ]

Wybiera obiekty z kolekcji indeksowanych, takie jak tablice i tabele skrótów. Indeksy tablic są od 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.

Na liście 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 kolekcją indeksowana, użycie operatora indeksu w celu uzyskania dostępu do pierwszego elementu zwraca sam obiekt. Indeks wartości poza pierwszym elementem zwraca wartość $null.

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 polecenia, które następuje po nim. Gdy dane wyjściowe zawierają więcej niż jeden obiekt ("kolekcję"), operator potoku wysyła obiekty po jednym na raz.

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

Operatory łańcucha potoku && i ||

Warunkowe wykonywanie potoku po prawej stronie na podstawie powodzenia 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 liczb całkowitych, 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 działa z znakami, a także liczbami całkowitymi.

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

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

Operator dostępu do członków .

Uzyskuje dostęp do właściwości i metod obiektu. Nazwa członka 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 listy, który nie ma tego członka, 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 członka ::

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

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

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

W prostych przypadkach warunkowych można użyć operatoraternarnego jako zamiennika if-else instrukcji .

Aby uzyskać więcej informacji, zobacz about_If.

Operator ujednania wartości null ??

Operator scalania wartości null zwraca ?? wartość swojego 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 swojego operandu po prawej stronie, jeśli operand po lewej stronie zwraca wartość niezerową.

$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 z ujedną wartością null ??=

Operator przypisania z ??= dzieloną wartością null przypisuje wartość swojego operandu po prawej stronie do swojego operandu po lewej stronie tylko wtedy, gdy operand po lewej stronie zwraca wartość null. Operator ??= nie ocenia swojego operandu po prawej stronie, jeśli operand po lewej stronie zwraca wartość niezerową.

$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 funkcji eksperymentalnej do wsparcia głównego w programie PowerShell 7.1.

Operator warunkowy o wartości null stosuje dostęp do elementu członkowskiego, ?., lub dostęp do elementu, , do swojego operandu tylko wtedy, ?[]gdy ten operand zwraca wartość niż null. W przeciwnym razie zwraca wartość null.

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

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

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

W poniższym przykładzie zostanie zwrócona wartość null bez próby uzyskania dostępu do nazwy członka 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 zwracana jest wartość null.

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

Uwaga

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

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

Zobacz też