about_Comparison_Operators

Korte beschrijving

De vergelijkingsoperatoren in PowerShell kunnen twee waarden vergelijken of elementen van een verzameling filteren op basis van een invoerwaarde.

Lange beschrijving

Met vergelijkingsoperatoren kunt u waarden vergelijken of waarden zoeken die overeenkomen met opgegeven patronen. PowerShell bevat de volgende vergelijkingsoperatoren:

Gelijkheid

  • -eq, , -ieq-ceq - is gelijk aan
  • -ne, - -ine-cne niet gelijk aan
  • -gt, , -igt-cgt - groter dan
  • -ge, - -ige-cge groter dan of gelijk aan
  • -lt, , -ilt-clt - kleiner dan
  • -le, - -ile-cle kleiner dan of gelijk aan

Afstemmen

  • -like, , -ilike-clike - tekenreeks komt overeen met jokertekenpatroon
  • -notlike, , -inotlike-cnotlike - tekenreeks komt niet overeen met jokertekenpatroon
  • -match, , -imatch-cmatch - tekenreeks komt overeen met regex-patroon
  • -notmatch, , - -inotmatch-cnotmatch tekenreeks komt niet overeen met regex-patroon

Vervanging

  • -replace, , -ireplace-creplace - vervangt tekenreeksen die overeenkomen met een regex-patroon

Insluiting

  • -contains, , -icontains-ccontains - verzameling bevat een waarde
  • -notcontains, , -inotcontains-cnotcontains - verzameling bevat geen waarde
  • -in - waarde bevindt zich in een verzameling
  • -notin - waarde bevindt zich niet in een verzameling

Type

  • -is - beide objecten zijn hetzelfde type
  • -isnot - de objecten zijn niet hetzelfde type

Algemene functies

Tekenreeksvergelijkingen zijn hoofdlettergevoelig, tenzij u de expliciete hoofdlettergevoelige operator gebruikt. Als u een vergelijkingsoperator hoofdlettergevoelig wilt maken, voegt u een c na de -operator toe. Is bijvoorbeeld -ceq de hoofdlettergevoelige versie van -eq. Als u de hoofdlettergevoeligheid expliciet wilt maken, voegt u een i na -. Is bijvoorbeeld -ieq de expliciet niet hoofdlettergevoelige versie van -eq.

Tekenreeksvergelijkingen maken gebruik van de InvariantCulture voor zowel hoofdlettergevoelige als niet-hoofdlettergevoelige vergelijkingen. De vergelijkingen zijn tussen Unicode-codepunten en gebruiken geen cultuurspecifieke sorteringsvolgorde. De resultaten zijn hetzelfde, ongeacht de huidige cultuur.

Wanneer de invoer van een operator een scalaire waarde is, retourneert de operator een Booleaanse waarde. Wanneer de invoer een verzameling is, retourneert de operator de elementen van de verzameling die overeenkomen met de rechterwaarde van de expressie. Als de verzameling geen overeenkomsten bevat, retourneren vergelijkingsoperatoren een lege matrix. Voorbeeld:

$a = (1, 2) -eq 3
$a.GetType().Name
$a.Count
Object[]
0

Er zijn enkele uitzonderingen:

  • De insluitings- en typeoperators retourneren altijd een Booleaanse waarde
  • De -replace operator retourneert het vervangingsresultaat
  • De -match en -notmatch operators vullen ook de $Matches automatische variabele, tenzij de linkerkant van de expressie een verzameling is.

Gelijkheidsoperators

-eq en -ne

Wanneer de linkerkant scalaire waarde is, -eq wordt Waar geretourneerd als de rechterzijde gelijk is aan, anders -eq wordt Onwaar geretourneerd. -nedoet het tegenovergestelde; het retourneert Onwaar wanneer beide zijden gelijkwaardig zijn; anders -ne wordt Waar geretourneerd.

Voorbeeld:

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

Wanneer de linkerkant een verzameling is, -eq worden deze leden geretourneerd die overeenkomen met de rechterkant, terwijl -ne ze eruit worden gefilterd.

Voorbeeld:

1,2,3 -eq 2             # Output: 2
"abc", "def" -eq "abc"  # Output: abc
"abc", "def" -ne "abc"  # Output: def

Deze operators verwerken alle elementen van de verzameling. Voorbeeld:

"zzz", "def", "zzz" -eq "zzz"
zzz
zzz

De gelijkheidsoperator kan objecten van verschillende typen vergelijken. Het is belangrijk om te begrijpen dat de waarde aan de rechterkant van de vergelijking kan worden geconverteerd naar het type linkse waarde voor vergelijking.

De tekenreeks '1.0' wordt bijvoorbeeld geconverteerd naar een geheel getal dat moet worden vergeleken met de waarde 1. Dit voorbeeld retourneert True.

PS> 1 -eq '1.0'
True

In dit voorbeeld wordt de waarde 1 geconverteerd naar een tekenreeks die moet worden vergeleken met tekenreeks '1.0'. Dit voorbeeld retourneert False.

PS> '1.0' -eq 1
False

De gelijkheidsoperatoren accepteren twee objecten, niet alleen een scalaire of verzameling. Maar het vergelijkingsresultaat is niet gegarandeerd zinvol voor de eindgebruiker. In het volgende voorbeeld ziet u het probleem.

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

In dit voorbeeld hebben we twee objecten met identieke eigenschappen gemaakt. Toch is het resultaat van de gelijkheidstest Onwaar omdat ze verschillende objecten zijn. Als u vergelijkbare klassen wilt maken, moet u System.IEquatable<T> in uw klas implementeren. In het volgende voorbeeld ziet u de gedeeltelijke implementatie van een MyFileInfoSet-klasse die System.IEquatable<T> implementeert en twee eigenschappen, Bestand en Grootte heeft. De Equals() methode retourneert True als de eigenschappen Bestand en Grootte van twee MyFileInfoSet-objecten hetzelfde zijn.

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

Een prominent voorbeeld van het vergelijken van willekeurige objecten is om erachter te komen of ze null zijn. Maar als u wilt bepalen of een variabele is $null, moet u aan de linkerkant van de gelijkheidsoperator plaatsen $null . Als u het aan de rechterkant plaatst, doet u niet wat u verwacht.

U kunt $a bijvoorbeeld een matrix met null-elementen gebruiken:

$a = 1, 2, $null, 4, $null, 6

De volgende tests die $a niet null zijn.

$null -ne $a
True

De volgende filers maken echter alle null-elementen uit $a:

$a -ne $null # Output: 1, 2, 4, 6
1
2
4
6

-gt, -ge, -lt en -le

-gt, , -ge-lten -le gedragen zich op dezelfde manier. Wanneer beide zijden scalaire waarden zijn, retourneren ze Waar of Onwaar , afhankelijk van hoe de twee zijden zich verhouden:

Operator Retourneert Waar wanneer...
-gt De linkerkant is groter
-ge De linkerkant is groter of gelijk aan
-lt De linkerkant is kleiner
-le De linkerkant is kleiner of gelijk aan

In de volgende voorbeelden retourneren alle instructies Waar.

8 -gt 6  # Output: True
8 -ge 8  # Output: True
6 -lt 8  # Output: True
8 -le 8  # Output: True

Notitie

In de meeste programmeertalen is >de operator groter dan de operator. In PowerShell wordt dit teken gebruikt voor omleiding. Zie about_Redirection voor meer informatie.

Wanneer de linkerkant een verzameling is, vergelijken deze operators elk lid van de verzameling met de rechterkant. Afhankelijk van hun logica behouden of verwijderen ze het lid.

Voorbeeld:

$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

Deze operators werken met elke klasse die System.IComparable implementeert.

Voorbeelden:

# 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'

In het volgende voorbeeld ziet u dat er geen symbool is op een Amerikaans QWERTY-toetsenbord dat na 'a' wordt gesorteerd. Het voedt een set met al deze symbolen aan de -gt operator om ze te vergelijken met 'a'. De uitvoer is een lege matrix.

$a=' ','`','~','!','@','#','$','%','^','&','*','(',')','_','+','-','=',
   '{','}','[',']',':',';','"','''','\','|','/','?','.','>',',','<'
$a -gt 'a'
# Output: Nothing

Als de twee zijden van de operators niet redelijk vergelijkbaar zijn, veroorzaken deze operators een niet-afsluitfout.

Overeenkomende operators

De overeenkomende operators (-like, -notlike, -matchen -notmatch) zoeken elementen die overeenkomen met of niet overeenkomen met een opgegeven patroon. Het patroon voor -like en -notlike is een jokertekenexpressie (met*, ?en[ ]) en -notmatch-match accepteert een reguliere expressie (Regex).

De syntaxis is:

<string[]> -like    <wildcard-expression>
<string[]> -notlike <wildcard-expression>
<string[]> -match    <regular-expression>
<string[]> -notmatch <regular-expression>

Wanneer de invoer van deze operators een scalaire waarde is, retourneren ze een Booleaanse waarde.

Wanneer de invoer een verzameling waarden is, wordt elk item in de verzameling geconverteerd naar een tekenreeks ter vergelijking. De -match operators retourneren -notmatch respectievelijk overeenkomende en niet-overeenkomende leden. De -like en -notlike operators retourneren de leden echter als tekenreeksen. De tekenreeks die wordt geretourneerd voor een lid van de verzameling door -like en -notlike is de tekenreeks die de operator voor de vergelijking gebruikt en wordt verkregen door het lid naar een tekenreeks te casten.

-like en -notlike

-likeen -notlike gedraagt zich op dezelfde manier als -eq en-ne, maar de rechterkant kan een tekenreeks zijn die jokertekens bevat.

Voorbeeld:

"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 en -notmatch

-match en -notmatch gebruik reguliere expressies om te zoeken naar een patroon in de waarden aan de linkerkant. Reguliere expressies kunnen overeenkomen met complexe patronen, zoals e-mailadressen, UNC-paden of opgemaakte telefoonnummers. De tekenreeks aan de rechterkant moet voldoen aan de regels voor reguliere expressies .

Scalaire voorbeelden:

# 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

Als de invoer een verzameling is, retourneren de operators de overeenkomende leden van die verzameling.

Voorbeelden van verzamelingen:

"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 en -notmatch ondersteuning voor regex capture-groepen. Telkens wanneer ze worden uitgevoerd op scalaire invoer en het -match resultaat Waar is, of het -notmatch resultaat Onwaar is, overschrijven ze de $Matches automatische variabele. $Matches is een hashtabel met altijd een sleutel met de naam 0, waarmee de hele overeenkomst wordt opgeslagen. Als de reguliere expressie capture-groepen bevat, bevat de $Matches expressie extra sleutels voor elke groep.

Het is belangrijk te weten dat de $Matches hashtabel alleen het eerste exemplaar van een overeenkomend patroon bevat.

Voorbeeld:

$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

Wanneer het -match resultaat Onwaar is of het -notmatch resultaat Waar is, of wanneer de invoer een verzameling is, wordt de $Matches automatische variabele niet overschreven. Daarom bevat deze de eerder ingestelde waarde of $null als de variabele niet is ingesteld. Wanneer u verwijst naar $Matches een van deze operators nadat u een van deze operators hebt aangeroepen, kunt u controleren of de variabele is ingesteld door de huidige operatoraanroep met behulp van een voorwaarde-instructie.

Voorbeeld:

if ("<version>1.0.0</version>" -match '<version>(.*?)</version>') {
    $Matches
}

Zie about_Regular_Expressions en about_Automatic_Variables voor meer informatie.

Vervangingsoperator

Vervanging met reguliere expressies

-replace De -matchoperator gebruikt reguliere expressies om het opgegeven patroon te vinden. Maar in tegenstelling tot -match, worden de overeenkomsten vervangen door een andere opgegeven waarde.

Syntaxis:

<input> -replace <regular-expression>, <substitute>

De operator vervangt alle of een deel van een waarde door de opgegeven waarde met behulp van reguliere expressies. U kunt de operator gebruiken voor veel beheertaken, zoals het wijzigen van de naam van bestanden. Met de volgende opdracht worden bijvoorbeeld de bestandsnaamextensies van alle .txt bestanden gewijzigd in .log:

Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }

De operator is standaard -replace niet hoofdlettergevoelig. Als u het hoofdlettergevoelig wilt maken, gebruikt u -creplace. Als u het expliciet niet hoofdlettergevoelig wilt maken, gebruikt u -ireplace.

Voorbeelden:

"book" -ireplace "B", "C" # Case insensitive
"book" -creplace "B", "C" # Case-sensitive; hence, nothing to replace
Cook
book

Vervangingen van reguliere expressies

Het is ook mogelijk om reguliere expressies te gebruiken om tekst dynamisch te vervangen met behulp van het vastleggen van groepen en vervangingen. Vastleggen van groepen kan in de <substitute> tekenreeks worden verwezen met behulp van het dollarteken ($) voor de groeps-id.

In het volgende voorbeeld accepteert de -replace operator een gebruikersnaam in de vorm van DomainName\Username en converteert deze naar de Username@DomainName indeling:

$SearchExp = '^(?<DomainName>[\w-.]+)\\(?<Username>[\w-.]+)$'
$ReplaceExp = '${Username}@${DomainName}'

'Contoso.local\John.Doe' -replace $SearchExp, $ReplaceExp
John.Doe@Contoso.local

Waarschuwing

Het $ teken heeft syntactische rollen in zowel PowerShell als reguliere expressies:

  • In PowerShell worden tussen dubbele aanhalingstekens variabelen aangewezen en fungeert deze als een operator voor subexpressie.
  • In Regex-zoekreeksen wordt het einde van de regel aangeduid.
  • In Regex-vervangingstekenreeksen worden vastgelegde groepen aangeduid. Zorg ervoor dat u de reguliere expressies tussen enkele aanhalingstekens plaatst of een backtick (`) voor de expressies invoegt.

Voorbeeld:

$1 = 'Goodbye'

'Hello World' -replace '(\w+) \w+', "$1 Universe"
# Output: Goodbye Universe

'Hello World' -replace '(\w+) \w+', '$1 Universe'
# Output: Hello Universe

$$in Regex geeft een letterlijke .$ Dit $$ in de vervangingstekenreeks om een letterlijke tekst $ in de resulterende vervanging op te nemen. Voorbeeld:

'5.72' -replace '(.+)', '$ $1' # Output: $ 5.72
'5.72' -replace '(.+)', '$$$1' # Output: $5.72
'5.72' -replace '(.+)', '$$1'  # Output: $1

Zie about_Regular_Expressions en Vervangingen in reguliere expressies voor meer informatie.

Vervangen in een verzameling

Wanneer de <input>-replace operator een verzameling is, past PowerShell de vervanging toe op elke waarde in de verzameling. Voorbeeld:

"B1","B2","B3","B4","B5" -replace "B", 'a'
a1
a2
a3
a4
a5

Insluitingsoperators

De insluitingsoperators (-contains, -notcontains, -inen -notin) zijn vergelijkbaar met de gelijkheidsoperatoren, behalve dat ze altijd een Booleaanse waarde retourneren, zelfs wanneer de invoer een verzameling is. Deze operators stoppen met vergelijken zodra ze de eerste overeenkomst detecteren, terwijl de gelijkheidsoperators alle invoerleden evalueren. In een zeer grote verzameling retourneren deze operators sneller dan de gelijkheidsoperators.

-bevat en -notcontains

Syntaxis:

<Collection> -contains <scalar-object>
<Collection> -notcontains <scalar-object>

Deze operators geven aan of een set een bepaald element bevat. -contains retourneert Waar wanneer de rechterkant (scalar-object) overeenkomt met een van de elementen in de set. -notcontains retourneert in plaats daarvan Onwaar.

Voorbeelden:

"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

Complexere voorbeelden:

$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
                 "ContosoDHCP","ContosoWSUS"
$thisComputer  = "ContosoDC2"

$DomainServers -contains $thisComputer
# Output: True

Wanneer de operand aan de rechterkant een verzameling is, converteren deze operators de waarde naar de tekenreeksweergave voordat deze wordt vergeleken met de verzameling aan de linkerkant.

$a = "abc", "def"
"abc", "def", "ghi" -contains $a # Output: False

# The following statements are equivalent
$a, "ghi" -contains $a           # Output: True
"$a", "ghi" -contains $a         # Output: True
"abc def", "ghi" -contains $a    # Output: True

-in en -notin

Syntaxis:

<scalar-object> -in <Collection>
<scalar-object> -notin <Collection>

De -in operators en -notin operators zijn in PowerShell 3 geïntroduceerd als syntactisch omgekeerd van en -contains-notcontains operators. -inretourneert Waar wanneer de linkerkant <scalar-object> overeenkomt met een van de elementen in de verzameling. -notin retourneert in plaats daarvan Onwaar .

In de volgende voorbeelden wordt hetzelfde gedaan als de voorbeelden -contains-notcontains , maar ze zijn geschreven met -in en -notin in plaats daarvan.

"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

Complexere voorbeelden:

$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
                 "ContosoDHCP","ContosoWSUS"
$thisComputer  = "ContosoDC2"

$thisComputer -in $DomainServers
# Output: True

Wanneer de operand aan de linkerkant een verzameling is, converteren deze operators de waarde naar de tekenreeksweergave voordat deze wordt vergeleken met de verzameling aan de rechterkant.

$a = "abc", "def"
$a -in "abc", "def", "ghi" # Output: False

# The following statements are equivalent
$a -in $a, "ghi"           # Output: True
$a -in "$a", "ghi"         # Output: True
$a -in "abc def", "ghi"    # Output: True

Typevergelijking

De operatoren voor typevergelijking (-is en -isnot) worden gebruikt om te bepalen of een object een specifiek type is.

Syntaxis:

<object> -is <type-reference>
<object> -isnot <type-reference>

Voorbeeld:

$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

Zie ook