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ę (modulus) operacji dzielenia.
Operator dodawania łączy elementy. Operator mnożenia zwraca określoną liczbę kopii każdego elementu. Operatory arytmetyczne można używać na dowolnym typie platformy .NET, które je implementują, na przykład: Int
, , String
DateTime
, Hashtable
, i 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
Użyj operatorów przypisania (=
, +=
, , -=
*=
, /=
, %=
), aby przypisywać, zmieniać lub dołączać 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
, -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ą one równe.
Operatory porównania zawierają również operatory, które wyszukują 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 jest wyświetlana w zestawie odwołań (-in
, -notin
, -contains
, -notcontains
).
Operatory porównania typów (-is
, ) określają, -isnot
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 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 , Tee-Object
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ągów. 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 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 -
do negacji. 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
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 operatora w wyrażeniach. Na przykład: (1 + 2) / 3
.
Jednak w programie PowerShell istnieją dodatkowe zachowania.
Grupowanie wyrażeń wyników
(...)
Umożliwia umożliwienie danych wyjściowych z polecenia uczestniczyć w wyrażeniu.
Na przykład:
PS> (Get-Item *.txt).Count -gt 10
True
Uwaga
Zawijanie polecenia w nawiasach powoduje, że zmienna $?
automatyczna ma być ustawiona na $true
wartość , nawet jeśli zamknięte polecenie jest ustawione $?
na $false
wartość .
Na przykład (Get-Item /Nosuch); $?
nieoczekiwanie zwraca wartość True. Aby uzyskać więcej informacji na temat $?
programu , zobacz about_Automatic_Variables.
Wyrażenia grupowane w potokach
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, zostanie ono uruchomione w celu ukończenia z wszystkimi danymi wyjściowymi zebranymi w pamięci przed wysłaniem wyników za pośrednictwem potoku.
Na przykład dane wyjściowe tych instrukcji są różne:
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'
Grupowanie wyrażenia przed potokiem gwarantuje również, że kolejne przetwarzanie obiektów po obiekcie nie może zakłócać wyliczania używanego przez polecenie w celu wygenerowania danych wyjściowych.
Na przykład potokowanie danych wyjściowych z Get-ChildItem
polecenia do Rename-Item
może mieć nieoczekiwane skutki, w których nazwa elementu została zmieniona, a następnie odnaleziono ponownie i zmieniono nazwę po raz drugi.
Instrukcje przypisania grupowania
Niezgrupowane instrukcje przypisania nie generują wartości wyjściowych. Podczas grupowania instrukcji przypisania wartość przypisanej zmiennej jest przekazywana i może być używana w większych wyrażeniach. Na przykład:
PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True
Zawijanie instrukcji w nawiasach zamienia ją w wyrażenie, które zwraca wartość $var
.
To zachowanie dotyczy wszystkich operatorów przypisania, w tym operatorów złożonych, takich jak +=
, i przyrost (++
) i operatorów dekrementacji (--
).
Jednak kolejność operacji przyrostu i dekrementacji zależy od ich położenia.
PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1
W przypadku prefiksu $i
wartość jest zwiększana przed utworzeniem danych wyjściowych. W przypadku postfiksu $i
wartość jest zwiększana po utworzeniu danych wyjściowych.
Można również użyć tej techniki w kontekście instrukcji warunkowej, takiej jak if
instrukcja .
if ($textFiles = Get-ChildItem *.txt) {
$textFiles.Count
}
W tym przykładzie, jeśli żadne pliki nie są zgodne, Get-ChildItem
polecenie nie zwraca nic i nie przypisuje nic do $textFiles
elementu , który jest brany pod uwagę $false
w kontekście logicznym. Jeśli do obiektu FileInfo jest przypisany $textFiles
co najmniej jeden obiekt FileInfo, funkcja warunkowa oblicza wartość $true
. Możesz pracować z wartością $textFiles
w treści instrukcji if
.
Uwaga
Chociaż ta technika jest wygodna i zwięzła, może prowadzić do nieporozumień między operatorem przypisania (=
) i operatorem porównania równości (-eq
).
Operator podexpression $( )
Zwraca wynik co najmniej jednej instrukcji. W przypadku pojedynczego wyniku zwraca skalarny. W przypadku wielu wyników zwraca tablicę. Użyj tego polecenia, 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 podexpressionu tablicy @( )
Zwraca wynik co najmniej jednej instrukcji jako tablicy. Wynik jest zawsze tablicą z co najmniej 0 obiektami.
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 wyrażenia podrzędnego tablicy, ta składnia służy do deklarowania tabeli skrótów. Aby uzyskać więcej informacji, zobacz about_Hash_Tables.
Operator połączenia &
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. Za pomocą tego polecenia można tworzyć ciągi zawierające potrzebne polecenia, parametry i argumenty, a następnie wywoływać ciąg tak, jakby był to polecenie. Tworzone ciągi muszą być zgodne z tymi samymi regułami analizowania co polecenie, które wpiszesz w wierszu polecenia. Aby uzyskać więcej informacji, zobacz about_Parsing.
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 poleceń 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.
At line:1 char:2
+ & $c
+ ~~
+ CategoryInfo : ObjectNotFound: (Get-Service -Name Spooler:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Polecenie cmdlet Invoke-Expression może wykonywać kod, który powoduje błędy analizowania podczas korzystania z operatora wywołania.
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
Skrypt można wykonać przy użyciu jego nazwy pliku. Plik skryptu musi mieć rozszerzenie pliku, .ps1
aby było plikiem wykonywalnym. Pliki, które mają spacje w ścieżce, muszą być ujęte w cudzysłowy. Jeśli spróbujesz wykonać ścieżkę cytowaną, program PowerShell wyświetli zawartość cytowanego ciągu zamiast uruchamiać skrypt. 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 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-Output
oczekuje argumentu, należy umieścić wyrażenie w nawiasach.
Operator określania źródła 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
Zapewnianie dostępu do funkcji formatowania złożonego platformy .NET. Ciąg formatu złożonego składa się ze stałego tekstu połączonego z indeksowanym symbolami zastępczymi, nazywanymi elementami formatu. Te elementy formatu odpowiadają obiektom na liście.
Każdy element formatu ma następującą postać i składa się z następujących składników:
{index[,alignment][:formatString]}
Pasujące nawiasy klamrowe ({
i }
) są wymagane.
Operacja formatowania zwraca ciąg wynikowy, który składa się z oryginalnego stałego tekstu zmieszanego z ciągiem reprezentującym obiekty na liście. Aby uzyskać więcej informacji, zobacz Formatowanie złożone.
Wprowadź ciąg formatu złożonego 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
Można wyzerować wartość liczbową z specyfikatorem niestandardowym "0". Liczba zer po parametrze :
wskazuje maksymalną szerokość do wypełnienia sformatowanego ciągu.
"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365
Jeśli musisz zachować nawiasy klamrowe ({}
) w sformatowanych ciągach, możesz je uniknąć, podwojając nawiasy klamrowe.
"{0} vs. {{0}}" -f 'foo'
foo vs. {0}
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...
Jeśli 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ą 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 dane wyjściowe ("potoki") 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'}
Operator zakresu ..
Operator zakresu może służyć do reprezentowania tablicy sekwencyjnych liczb całkowitych. Wartości połączone przez operator zakresu definiują wartości początkowe i końcowe zakresu.
1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}
Można również tworzyć zakresy w odwrotnej kolejności.
10..1
5..-5 | ForEach-Object {Write-Output $_}
Wartości początkowe i końcowe zakresu mogą być dowolną parą wyrażeń, które są obliczane na liczbę całkowitą lub znak. Punkty końcowe zakresu muszą być konwertowane na podpisane 32-bitowe liczby całkowite ([int32]
). Większe wartości powodują błąd. Ponadto, jeśli zakres jest przechwytywany w tablicy, rozmiar wynikowej tablicy jest ograniczony do 268435448
(lub 256mb - 8
). Jest to maksymalny rozmiar tablicy w programie .NET Framework.
Można na przykład użyć elementów członkowskich wyliczenia dla wartości początkowych i końcowych.
PS> enum Food {
Apple
Banana = 3
Kiwi = 10
}
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10
Ważne
Wynikowy zakres nie jest ograniczony do wartości wyliczenia. Zamiast tego reprezentuje zakres wartości między dwiema podanymi wartościami. Nie można użyć operatora zakresu, aby niezawodnie reprezentować elementy członkowskie wyliczenia.
Operator dostępu do składowych .
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. 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]:: $_ }