about_Comparison_Operators
Krótki opis
Operatory porównania w programie PowerShell mogą porównywać dwie wartości lub filtrować elementy kolekcji z wartością wejściową.
Długi opis
Operatory porównania umożliwiają porównywanie wartości lub znajdowanie wartości pasujących do określonych wzorców. Program PowerShell zawiera następujące operatory porównania:
Równość
-eq
,-ieq
,-ceq
— równa się-ne
,-ine
,-cne
— nie równa się-gt
,-igt
,-igt
— większe niż-ge
,-ige
,-cge
— większe lub równe-lt
,-ilt
,-clt
— mniejsze niż-le
,-ile
,-cle
— mniejsze lub równe
Matching
-like
, ,-ilike
-clike
— ciąg pasuje do wzorca symboli wieloznacznych-notlike
, ,-inotlike
-cnotlike
— ciąg nie jest zgodny ze wzorcem symboli wieloznacznych-match
, ,-imatch
-cmatch
— ciąg pasuje do wzorca wyrażenia regularnego-notmatch
, ,-inotmatch
-cnotmatch
— ciąg nie jest zgodny ze wzorcem wyrażeń regularnych
Funkcja zastępująca
-replace
,-ireplace
-creplace
, — zastępuje ciągi pasujące do wzorca wyrażenia regularnego
Zawieranie
-contains
, ,-icontains
-ccontains
— kolekcja zawiera wartość-notcontains
,-inotcontains
,-cnotcontains
— kolekcja nie zawiera wartości-in
- wartość znajduje się w kolekcji-notin
— wartość nie znajduje się w kolekcji
Typ
-is
- oba obiekty są tego samego typu-isnot
- obiekty nie są tego samego typu
Typowe funkcje
Porównania ciągów są bez uwzględniania wielkości liter, chyba że jest używany jawny operator uwzględniający wielkość liter. Aby uwzględniać wielkość liter operatora porównania, dodaj wartość c
po .-
Na przykład -ceq
jest uwzględniana wielkość liter w -eq
wersji .
Aby jawnie ustawić bez uwzględniania wielkości liter, dodaj element i
po -
. Na przykład -ieq
jest jawnie bez uwzględniania wielkości liter w wersji -eq
.
Gdy dane wejściowe operatora są wartością skalarną, operator zwraca wartość logiczną . Gdy dane wejściowe są kolekcją, operator zwraca elementy kolekcji zgodne z prawą wartością wyrażenia. Jeśli w kolekcji nie ma dopasowań, operatory porównania zwracają pustą tablicę. Na przykład:
$a = (1, 2 -eq 3)
$a.GetType().Name
$a.Count
Object[]
0
Istnieje kilka wyjątków:
- Operatory zawierania i typów zawsze zwracają wartość logiczną
- Operator
-replace
zwraca wynik zamiany - Operatory
-match
i-notmatch
wypełniają również zmienną$Matches
automatyczną, chyba że lewa strona wyrażenia jest kolekcją.
Operatory równości
-eq i -ne
Gdy lewa strona jest skalarna, zwraca wartość True, -eq
jeśli po prawej stronie jest dokładne dopasowanie, w przeciwnym razie -eq
zwraca wartość False. -ne
wykonuje odwrotnie; zwraca wartość False , gdy obie strony są zgodne; -ne
w przeciwnym razie zwraca wartość True.
Przykład:
2 -eq 2 # Output: True
2 -eq 3 # Output: False
"abc" -eq "abc" # Output: True
"abc" -eq "abc", "def" # Output: False
"abc" -ne "def" # Output: True
"abc" -ne "abc" # Output: False
"abc" -ne "abc", "def" # Output: True
Gdy lewa strona jest kolekcją, -eq
zwraca te elementy członkowskie zgodne z prawą stroną, a następnie -ne
filtruje je.
Przykład:
1,2,3 -eq 2 # Output: 2
"abc", "def" -eq "abc" # Output: abc
"abc", "def" -ne "abc" # Output: def
Te operatory przetwarzają wszystkie elementy kolekcji. Przykład:
"zzz", "def", "zzz" -eq "zzz"
zzz
zzz
Operator równości może porównywać obiekty różnych typów. Ważne jest, aby zrozumieć, że wartość znajduje się po prawej stronie porównania, można przekonwertować na typ wartości po lewej stronie do porównania.
Na przykład ciąg '1.0'
jest konwertowany na liczbę całkowitą, która ma być porównywana z wartością 1
. Ten przykład zwraca wartość True
.
PS> 1 -eq '1.0'
True
W tym przykładzie wartość 1
jest konwertowana na ciąg, który ma być porównywany z ciągiem '1.0'
. Ten przykład zwraca wartość False
.
PS> '1.0' -eq 1
False
Operatory równości akceptują wszystkie dwa obiekty, a nie tylko skalarne lub kolekcje. Jednak wynik porównania nie jest gwarantowany dla użytkownika końcowego. W poniższym przykładzie pokazano problem.
class MyFileInfoSet {
[String]$File
[Int64]$Size
}
$a = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$b = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$a -eq $b
False
W tym przykładzie utworzyliśmy dwa obiekty o identycznych właściwościach. Jednak wynik testu równości ma wartość False , ponieważ są to różne obiekty. Aby utworzyć porównywalne klasy, należy zaimplementować klasę System.IEquatable<T> w swojej klasie. W poniższym przykładzie pokazano częściową implementację klasy MyFileInfoSet , która implementuje metodę System.IEquatable<T> i ma dwie właściwości : Plik i Rozmiar. Metoda Equals()
zwraca wartość True , jeśli
class MyFileInfoSet : System.IEquatable[Object] {
[String]$File
[Int64]$Size
[bool] Equals([Object] $obj) {
return ($this.File -eq $obj.File) -and ($this.Size -eq $obj.Size)
}
}
$a = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$b = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$a -eq $b
True
Widocznym przykładem porównywania dowolnych obiektów jest stwierdzenie, czy mają one wartość null. Jeśli jednak musisz określić, czy zmienna to $null
, musisz umieścić $null
po lewej stronie operatora równości. Umieszczenie go po prawej stronie nie robi tego, czego oczekujesz.
Na przykład niech $a
będzie tablicą zawierającą elementy o wartości null:
$a = 1, 2, $null, 4, $null, 6
Następujące testy, które $a
nie mają wartości null.
$null -ne $a
True
Jednak następujące pliki wykluczają wszystkie elementy o wartości null z elementu $a
:
$a -ne $null # Output: 1, 2, 4, 6
1
2
4
6
-gt, -ge, -lt i -le
-gt
, , -ge
-lt
i -le
zachowuje się bardzo podobnie. Gdy obie strony są skalarne, zwracają wartość Prawda lub Fałsz w zależności od porównania obu stron:
Operator | Zwraca wartość True, gdy... |
---|---|
-gt |
Lewa strona jest większa |
-ge |
Lewa strona jest większa lub równa |
-lt |
Lewa strona jest mniejsza |
-le |
Lewa strona jest mniejsza lub równa |
W poniższych przykładach wszystkie instrukcje zwracają wartość True.
8 -gt 6 # Output: True
8 -ge 8 # Output: True
6 -lt 8 # Output: True
8 -le 8 # Output: True
Uwaga
W większości języków programowania operator greater-than to >
. W programie PowerShell ten znak jest używany do przekierowywania. Aby uzyskać szczegółowe informacje, zobacz about_Redirection.
Gdy lewa strona jest kolekcją, te operatory porównują każdy element członkowski kolekcji z prawej strony. W zależności od ich logiki zachowają lub odrzucą element członkowski.
Przykład:
$a=5, 6, 7, 8, 9
Write-Output "Test collection:"
$a
Write-Output "`nMembers greater than 7"
$a -gt 7
Write-Output "`nMembers greater than or equal to 7"
$a -ge 7
Write-Output "`nMembers smaller than 7"
$a -lt 7
Write-Output "`nMembers smaller than or equal to 7"
$a -le 7
Test collection:
5
6
7
8
9
Members greater than 7
8
9
Members greater than or equal to 7
7
8
9
Members smaller than 7
5
6
Members smaller than or equal to 7
5
6
7
Te operatory współpracują z dowolną klasą, która implementuje system.IComparable.
Przykłady:
# Date comparison
[DateTime]'2001-11-12' -lt [DateTime]'2020-08-01' # True
# Sorting order comparison
'a' -lt 'z' # True; 'a' comes before 'z'
'macOS' -ilt 'MacOS' # False
'MacOS' -ilt 'macOS' # False
'macOS' -clt 'MacOS' # True; 'm' comes before 'M'
W poniższym przykładzie pokazano, że na amerykańskiej klawiaturze QWERTY nie ma symbolu, który jest sortowany po znaku "a". Przekazuje zestaw zawierający wszystkie takie symbole operatorowi -gt
, aby porównać je z "a". Dane wyjściowe są pustą tablicą.
$a=' ','`','~','!','@','#','$','%','^','&','*','(',')','_','+','-','=',
'{','}','[',']',':',';','"','''','\','|','/','?','.','>',',','<'
$a -gt 'a'
# Output: Nothing
Jeśli obie strony operatorów nie są rozsądnie porównywalne, te operatory zgłaszają błąd niepowodujący zakończenia.
Pasujące operatory
Pasujące operatory (-like
, -notlike
, -match
i -notmatch
) znajdują elementy zgodne lub niezgodne z określonym wzorcem. Wzorzec dla -like
elementu i -notlike
jest wyrażeniem wieloznacznymi (zawierającym *
, ?
i [ ]
), podczas gdy -match
i -notmatch
akceptuje wyrażenie regularne (Regex).
Składnia jest następująca:
<string[]> -like <wildcard-expression>
<string[]> -notlike <wildcard-expression>
<string[]> -match <regular-expression>
<string[]> -notmatch <regular-expression>
Gdy dane wejściowe tych operatorów są wartością skalarną, zwracają wartość logiczną . Gdy dane wejściowe są kolekcją wartości, operatory zwracają wszystkie pasujące elementy członkowskie. Jeśli w kolekcji nie ma dopasowań, operatory zwracają pustą tablicę.
-like i -notlike
-like
i zachowują się podobnie do -eq
i -ne
-notlike
, ale po prawej stronie może być ciąg zawierający symbole wieloznaczne.
Przykład:
"PowerShell" -like "*shell" # Output: True
"PowerShell" -notlike "*shell" # Output: False
"PowerShell" -like "Power?hell" # Output: True
"PowerShell" -notlike "Power?hell" # Output: False
"PowerShell" -like "Power[p-w]hell" # Output: True
"PowerShell" -notlike "Power[p-w]hell" # Output: False
"PowerShell", "Server" -like "*shell" # Output: PowerShell
"PowerShell", "Server" -notlike "*shell" # Output: Server
-match and -notmatch
-match
i -notmatch
użyj wyrażeń regularnych, aby wyszukać wzorzec w wartościach po lewej stronie. Wyrażenia regularne mogą być zgodne ze złożonymi wzorcami, takimi jak adresy e-mail, ścieżki UNC lub sformatowane numery telefonów. Ciąg po prawej stronie musi być zgodny z regułami wyrażeń regularnych .
Przykłady skalarne:
# Partial match test, showing how differently -match and -like behave
"PowerShell" -match 'shell' # Output: True
"PowerShell" -like 'shell' # Output: False
# Regex syntax test
"PowerShell" -match '^Power\w+' # Output: True
'bag' -notmatch 'b[iou]g' # Output: True
Jeśli dane wejściowe są kolekcją, operatorzy zwracają pasujące elementy członkowskie tej kolekcji.
Przykłady kolekcji:
"PowerShell", "Super PowerShell", "Power's hell" -match '^Power\w+'
# Output: PowerShell
"Rhell", "Chell", "Mel", "Smell", "Shell" -match "hell"
# Output: Rhell, Chell, Shell
"Bag", "Beg", "Big", "Bog", "Bug" -match 'b[iou]g'
#Output: Big, Bog, Bug
"Bag", "Beg", "Big", "Bog", "Bug" -notmatch 'b[iou]g'
#Output: Bag, Beg
-match
obsługa -notmatch
grup przechwytywania wyrażeń regularnych. Za każdym razem, gdy są uruchamiane w danych wejściowych skalarnych, a -match
wynik to True lub -notmatch
wynik to False, zastępują zmienną automatyczną $Matches
. $Matches
jest tabelą skrótu , która zawsze ma klucz o nazwie "0", który przechowuje całe dopasowanie.
Jeśli wyrażenie regularne zawiera grupy przechwytywania, zawiera $Matches
dodatkowe klucze dla każdej grupy.
Należy pamiętać, że tabela skrótów $Matches
zawiera tylko pierwsze wystąpienie dowolnego pasującego wzorca.
Przykład:
$string = 'The last logged on user was CONTOSO\jsmith'
$string -match 'was (?<domain>.+)\\(?<user>.+)'
$Matches
Write-Output "`nDomain name:"
$Matches.domain
Write-Output "`nUser name:"
$Matches.user
True
Name Value
---- -----
domain CONTOSO
user jsmith
0 was CONTOSO\jsmith
Domain name:
CONTOSO
User name:
jsmith
-match
Gdy wynik ma wartość False lub -notmatch
wynik ma wartość True lub gdy dane wejściowe są kolekcją, $Matches
zmienna automatyczna nie zostanie zastąpiona. W związku z tym będzie zawierać wcześniej ustawioną wartość lub $null
jeśli zmienna nie została ustawiona. Podczas odwoływania się po wywołaniu $Matches
jednego z tych operatorów rozważ sprawdzenie, czy zmienna została ustawiona przez wywołanie bieżącego operatora przy użyciu instrukcji warunku.
Przykład:
if ("<version>1.0.0</version>" -match '<version>(.*?)</version>') {
$Matches
}
Aby uzyskać szczegółowe informacje, zobacz about_Regular_Expressions i about_Automatic_Variables.
Operator zastępczy
Zastępowanie wyrażeniami regularnymi
Podobnie jak -match
, -replace
operator używa wyrażeń regularnych do znalezienia określonego wzorca. Ale w przeciwieństwie do -match
elementu , zastępuje dopasowania inną określoną wartością.
Składnia:
<input> -replace <regular-expression>, <substitute>
Operator zastępuje całą lub część wartości określoną wartością przy użyciu wyrażeń regularnych. Możesz użyć operatora dla wielu zadań administracyjnych, takich jak zmiana nazwy plików. Na przykład następujące polecenie zmienia rozszerzenia nazw plików na .txt
.log
:
Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }
Domyślnie -replace
operator jest bez uwzględniania wielkości liter. Aby uwzględniać wielkość liter, użyj polecenia -creplace
. Aby jawnie bez uwzględniania wielkości liter, użyj polecenia -ireplace
.
Przykłady:
"book" -ireplace "B", "C" # Case insensitive
"book" -creplace "B", "C" # Case-sensitive; hence, nothing to replace
Cook
book
Podstawy wyrażeń regularnych
Istnieje również możliwość używania wyrażeń regularnych do dynamicznego zastępowania tekstu przy użyciu grup przechwytywania i podstawiania. Grupy przechwytywania mogą być przywoływane w <substitute>
ciągu przy użyciu znaku dolara ($
) przed identyfikatorem grupy.
W poniższym przykładzie -replace
operator akceptuje nazwę użytkownika w postaci DomainName\Username
i konwertuje na Username@DomainName
format:
$SearchExp = '^(?<DomainName>[\w-.]+)\\(?<Username>[\w-.]+)$'
$ReplaceExp = '${Username}@${DomainName}'
'Contoso.local\John.Doe' -replace $SearchExp, $ReplaceExp
John.Doe@Contoso.local
Ostrzeżenie
Znak $
ma role składniowe zarówno w programie PowerShell, jak i wyrażeniach regularnych:
- W programie PowerShell między podwójnym cudzysłowem wyznacza zmienne i działa jako operator podekskrypcji.
- W ciągach wyszukiwania wyrażeń regularnych oznacza koniec wiersza.
- W ciągach podstawiania regex oznacza przechwycone grupy. Pamiętaj, aby umieścić wyrażenia regularne między pojedynczymi znakami cudzysłowu lub wstawić znak backtick (
`
) przed nimi.
Na przykład:
$1 = 'Goodbye'
'Hello World' -replace '(\w+) \w+', "$1 Universe"
# Output: Goodbye Universe
'Hello World' -replace '(\w+) \w+', '$1 Universe'
# Output: Hello Universe
$$
w regex oznacza literał $
. To $$
w ciągu podstawienia, aby uwzględnić literał $
w wynikowym zastąpieniu. Na przykład:
'5.72' -replace '(.+)', '$ $1' # Output: $ 5.72
'5.72' -replace '(.+)', '$$$1' # Output: $5.72
'5.72' -replace '(.+)', '$$1' # Output: $1
Aby dowiedzieć się więcej, zobacz about_Regular_Expressions i podstawienia w wyrażeniach regularnych.
Podstawianie w kolekcji
Gdy <input>
operator to -replace
kolekcja, program PowerShell stosuje zamianę do każdej wartości w kolekcji. Na przykład:
"B1","B2","B3","B4","B5" -replace "B", 'a'
a1
a2
a3
a4
a5
Zastępowanie blokiem skryptu
W programie PowerShell 6 lub nowszym -replace
operator akceptuje również blok skryptu, który wykonuje zamianę. Blok skryptu jest uruchamiany raz dla każdego dopasowania.
Składnia:
<String> -replace <regular-expression>, {<Script-block>}
W bloku skryptu użyj zmiennej automatycznej $_
, aby uzyskać dostęp do zastępowanego tekstu wejściowego i innych przydatnych informacji. Typ klasy tej zmiennej to System.Text.RegularExpressions.Match.
Poniższy przykład zastępuje każdą sekwencję trzech cyfr odpowiednikami znaków. Blok skryptu jest uruchamiany dla każdego zestawu trzech cyfr, które należy zamienić.
"072101108108111" -replace "\d{3}", {return [char][int]$_.Value}
Hello
Operatory zawierania
Operatory zawierania (-contains
, -notcontains
, -in
i -notin
) są podobne do operatorów równości, z wyjątkiem tego, że zawsze zwracają wartość logiczną, nawet jeśli dane wejściowe są kolekcją. Te operatory przestają porównywać zaraz po wykryciu pierwszego dopasowania, podczas gdy operatory równości oceniają wszystkie elementy wejściowe. W bardzo dużej kolekcji te operatory zwracają się szybciej niż operatory równości.
Składnia:
<Collection> -contains <Test-object>
<Collection> -notcontains <Test-object>
<Test-object> -in <Collection>
<Test-object> -notin <Collection>
-contains and -notcontains
Te operatory informują, czy zestaw zawiera określony element. -contains
zwraca wartość True , gdy po prawej stronie (obiekt testowy) pasuje do jednego z elementów w zestawie. -notcontains
Zamiast tego zwraca wartość False. Gdy obiekt testowy jest kolekcją, te operatory używają równości odwołań, tj. sprawdzają, czy jeden z elementów zestawu jest tym samym wystąpieniem obiektu testowego.
Przykłady:
"abc", "def" -contains "def" # Output: True
"abc", "def" -notcontains "def" # Output: False
"Windows", "PowerShell" -contains "Shell" # Output: False
"Windows", "PowerShell" -notcontains "Shell" # Output: True
"abc", "def", "ghi" -contains "abc", "def" # Output: False
"abc", "def", "ghi" -notcontains "abc", "def" # Output: True
Bardziej złożone przykłady:
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
"ContosoDHCP","ContosoWSUS"
$thisComputer = "ContosoDC2"
$DomainServers -contains $thisComputer
# Output: True
$a = "abc", "def"
"abc", "def", "ghi" -contains $a # Output: False
$a, "ghi" -contains $a # Output: True
-in i -notin
Operatory -in
i -notin
zostały wprowadzone w programie PowerShell 3 jako składniowy zwrot operatorów -contains
i -notcontains
. -in
zwraca wartość True , gdy lewa strona <test-object>
pasuje do jednego z elementów w zestawie. -notin
Zamiast tego zwraca wartość False . Gdy obiekt testowy jest zestawem, te operatory używają równości odwołania, aby sprawdzić, czy jeden z elementów zestawu jest tym samym wystąpieniem obiektu testowego.
Poniższe przykłady robią to samo, co w przykładach i -contains
-notcontains
robią to, ale są one napisane za pomocą -in
polecenia i -notin
zamiast tego.
"def" -in "abc", "def" # Output: True
"def" -notin "abc", "def" # Output: False
"Shell" -in "Windows", "PowerShell" # Output: False
"Shell" -notin "Windows", "PowerShell" # Output: True
"abc", "def" -in "abc", "def", "ghi" # Output: False
"abc", "def" -notin "abc", "def", "ghi" # Output: True
Bardziej złożone przykłady:
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
"ContosoDHCP","ContosoWSUS"
$thisComputer = "ContosoDC2"
$thisComputer -in $DomainServers
# Output: True
$a = "abc", "def"
$a -in "abc", "def", "ghi" # Output: False
$a -in $a, "ghi" # Output: True
Porównanie typów
Operatory porównania typów (-is
i -isnot
) służą do określania, czy obiekt jest określonym typem.
Składnia:
<object> -is <type-reference>
<object> -isnot <type-reference>
Przykład:
$a = 1
$b = "1"
$a -is [int] # Output: True
$a -is $b.GetType() # Output: False
$b -isnot [int] # Output: True
$a -isnot $b.GetType() # Output: True