about_Comparison_Operators
Description courte
Les opérateurs de comparaison dans PowerShell peuvent comparer deux valeurs ou filtrer des éléments d’une collection par rapport à une valeur d’entrée.
Description longue
Les opérateurs de comparaison vous permettent de comparer des valeurs ou de rechercher des valeurs qui correspondent à des modèles spécifiés. PowerShell inclut les opérateurs de comparaison suivants :
Égalité
-eq
,-ieq
,-ceq
- est égal à-ne
,-ine
, --cne
n’est pas égal à-gt
,-igt
, --cgt
supérieur à-ge
,-ige
, --cge
supérieur ou égal à-lt
,-ilt
, --clt
inférieur à-le
,-ile
, --cle
inférieur ou égal à
Correspondant
-like
,-ilike
,-clike
- string correspond au modèle de caractères génériques-notlike
,-inotlike
,-cnotlike
- la chaîne ne correspond pas au modèle générique-match
,-imatch
,-cmatch
- string correspond au modèle regex-notmatch
,-inotmatch
,-cnotmatch
- la chaîne ne correspond pas au modèle regex
Remplacement
-replace
,-ireplace
, --creplace
remplace les chaînes correspondant à un modèle regex
Containment
-contains
,-icontains
,-ccontains
- collection contient une valeur-notcontains
,-inotcontains
,-cnotcontains
- collection ne contient pas de valeur-in
- la valeur se trouve dans une collection-notin
- la valeur n’est pas dans une collection
Type
-is
- les deux objets sont du même type-isnot
- les objets ne sont pas du même type
Fonctionnalités communes
Les comparaisons de chaînes ne respectent pas la casse, sauf si vous utilisez l’opérateur explicite respectant la casse. Pour qu’un opérateur de comparaison respecte la casse, ajoutez un c
après le -
. Par exemple, -ceq
est la version sensible à la casse de -eq
.
Pour rendre explicite l’insensibilité à la casse, ajoutez un i
après -
. Par exemple, -ieq
est la version qui ne respecte pas explicitement la casse de -eq
.
Les comparaisons de chaînes utilisent InvariantCulture pour les comparaisons respectant la casse et ne respectant pas la casse. Les comparaisons sont effectuées entre des points de code Unicode et n’utilisent pas l’ordre de classement propre à la culture. Les résultats sont les mêmes quelle que soit la culture actuelle.
Lorsque l’entrée d’un opérateur est une valeur scalaire , l’opérateur retourne une valeur booléenne . Lorsque l’entrée est une collection, l’opérateur retourne les éléments de la collection qui correspondent à la valeur de droite de l’expression. S’il n’y a aucune correspondance dans la collection, les opérateurs de comparaison retournent un tableau vide. Par exemple :
$a = (1, 2) -eq 3
$a.GetType().Name
$a.Count
Object[]
0
Il existe quelques exceptions :
- Les opérateurs de confinement et de type retournent toujours une valeur booléenne
- L’opérateur
-replace
retourne le résultat de remplacement - Les
-match
opérateurs et-notmatch
remplissent également la$Matches
variable automatique, sauf si le côté gauche de l’expression est une collection.
Opérateurs d’égalité
-eq et -ne
Lorsque le côté gauche est scalaire, -eq
retourne True si le côté droit est équivalent ; sinon, -eq
retourne False. -ne
fait l’inverse ; elle retourne False lorsque les deux côtés sont équivalents ; dans le cas contraire, -ne
retourne La valeur True.
Exemple :
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
Lorsque le côté gauche est une collection, -eq
retourne les membres qui correspondent au côté droit, tout en -ne
les filtre.
Exemple :
1,2,3 -eq 2 # Output: 2
"abc", "def" -eq "abc" # Output: abc
"abc", "def" -ne "abc" # Output: def
Ces opérateurs traitent tous les éléments de la collection. Exemple :
"zzz", "def", "zzz" -eq "zzz"
zzz
zzz
L’opérateur d’égalité peut comparer des objets de différents types. Il est important de comprendre que la valeur située à droite de la comparaison peut être convertie en type de la valeur du côté gauche à des fins de comparaison.
Par exemple, la chaîne '1.0'
est convertie en entier à comparer à la valeur 1
. Cet exemple retourne True
.
PS> 1 -eq '1.0'
True
Dans cet exemple, la valeur 1
est convertie en chaîne à comparer à la chaîne '1.0'
. Cet exemple retourne False
.
PS> '1.0' -eq 1
False
Les opérateurs d’égalité acceptent deux objets, pas seulement un scalaire ou une collection. Toutefois, il n’est pas garanti que le résultat de la comparaison soit significatif pour l’utilisateur final. L’exemple suivant illustre le problème.
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
Dans cet exemple, nous avons créé deux objets avec des propriétés identiques. Pourtant, le résultat du test d’égalité est False , car il s’agit d’objets différents. Pour créer des classes comparables, vous devez implémenter System.IEquatable<T> dans votre classe. L’exemple suivant illustre l’implémentation partielle d’une classe MyFileInfoSet qui implémente System.IEquatable<T> et possède deux propriétés, File et Size. La Equals()
méthode retourne True si les propriétés File et Size de deux objets MyFileInfoSet sont identiques.
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
Un exemple important de comparaison d’objets arbitraires consiste à déterminer s’ils sont null. Toutefois, si vous devez déterminer si une variable est $null
, vous devez placer $null
sur le côté gauche de l’opérateur d’égalité. Le mettre sur le côté droit ne fait pas ce que vous attendez.
Par exemple, il s’agit $a
d’un tableau contenant des éléments null :
$a = 1, 2, $null, 4, $null, 6
Les tests $a
suivants ne sont pas null.
$null -ne $a
True
Toutefois, les éléments suivants permettent d’extraire tous les éléments null de $a
:
$a -ne $null # Output: 1, 2, 4, 6
1
2
4
6
-gt, -ge, -lt et -le
-gt
, -ge
, -lt
et -le
se comportent de la même façon. Lorsque les deux côtés sont scalaires, ils retournent True ou False en fonction de la façon dont les deux côtés se comparent :
Opérateur | Retourne La valeur True lorsque... |
---|---|
-gt |
Le côté gauche est plus grand |
-ge |
Le côté gauche est supérieur ou égal à |
-lt |
Le côté gauche est plus petit |
-le |
Le côté gauche est plus petit ou égal |
Dans les exemples suivants, toutes les instructions retournent True.
8 -gt 6 # Output: True
8 -ge 8 # Output: True
6 -lt 8 # Output: True
8 -le 8 # Output: True
Notes
Dans la plupart des langages de programmation, l’opérateur supérieur à est >
. Dans PowerShell, ce caractère est utilisé pour la redirection. Pour plus d’informations, consultez about_Redirection.
Lorsque le côté gauche est une collection, ces opérateurs comparent chaque membre de la collection avec le côté droit. Selon leur logique, ils conservent ou abandonnent le membre.
Exemple :
$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
Ces opérateurs fonctionnent avec n’importe quelle classe qui implémente System.IComparable.
Exemples :
# 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'
L’exemple suivant montre qu’il n’existe aucun symbole sur un clavier QWERTY américain trié après « a ». Il alimente un jeu contenant tous ces symboles à l’opérateur -gt
pour les comparer à « a ». La sortie est un tableau vide.
$a=' ','`','~','!','@','#','$','%','^','&','*','(',')','_','+','-','=',
'{','}','[',']',':',';','"','''','\','|','/','?','.','>',',','<'
$a -gt 'a'
# Output: Nothing
Si les deux côtés des opérateurs ne sont pas raisonnablement comparables, ces opérateurs posent une erreur sans fin.
Opérateurs de correspondance
Les opérateurs correspondants (-like
, , -notlike
-match
et -notmatch
) recherchent des éléments qui correspondent ou ne correspondent pas à un modèle spécifié. Le modèle pour -like
et -notlike
est une expression générique (contenant *
, ?
et [ ]
), tandis que -match
et -notmatch
accepte une expression régulière (Regex).
La syntaxe est :
<string[]> -like <wildcard-expression>
<string[]> -notlike <wildcard-expression>
<string[]> -match <regular-expression>
<string[]> -notmatch <regular-expression>
Lorsque l’entrée de ces opérateurs est une valeur scalaire, ils retournent une valeur booléenne .
Lorsque l’entrée est une collection de valeurs, chaque élément de la collection est converti en chaîne à des fins de comparaison. Les -match
opérateurs et -notmatch
retournent les membres correspondants et non correspondants respectivement. Toutefois, les -like
opérateurs et -notlike
retournent les membres sous forme de chaînes. La chaîne retournée pour un membre de la collection par -like
et -notlike
est la chaîne utilisée pour la comparaison et est obtenue en cassant le membre en une chaîne.
-like et -notlike
-like
et -notlike
se comportent de la même façon que -eq
et -ne
, mais le côté droit peut être une chaîne contenant des caractères génériques.
Exemple :
"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 et -notmatch
-match
et -notmatch
utilisez des expressions régulières pour rechercher un modèle dans les valeurs de gauche. Les expressions régulières peuvent correspondre à des modèles complexes tels que des adresses e-mail, des chemins UNC ou des numéros de téléphone mis en forme. La chaîne de droite doit respecter les règles d’expressions régulières .
Exemples scalaires :
# 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
Si l’entrée est une collection, les opérateurs retournent les membres correspondants de cette collection.
Exemples de collection :
"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
et -notmatch
prennent en charge les groupes de capture regex. Chaque fois qu’ils s’exécutent sur une entrée scalaire et que le -match
résultat est True ou que le -notmatch
résultat est False, ils remplacent la $Matches
variable automatique. $Matches
est une table de hachage qui a toujours une clé nommée « 0 », qui stocke l’intégralité de la correspondance.
Si l’expression régulière contient des groupes de capture, contient des $Matches
clés supplémentaires pour chaque groupe.
Il est important de noter que la $Matches
table de hachage contient uniquement la première occurrence d’un modèle de correspondance.
Exemple :
$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
Lorsque le -match
résultat est False, ou que le -notmatch
résultat est True, ou lorsque l’entrée est une collection, la $Matches
variable automatique n’est pas remplacée. Par conséquent, il contiendra la valeur précédemment définie, ou $null
si la variable n’a pas été définie. Lors de la $Matches
référence après l’appel de l’un de ces opérateurs, envisagez de vérifier que la variable a été définie par l’appel de l’opérateur actuel à l’aide d’une instruction de condition.
Exemple :
if ("<version>1.0.0</version>" -match '<version>(.*?)</version>') {
$Matches
}
Pour plus d’informations , consultez about_Regular_Expressions et about_Automatic_Variables.
Opérateur de remplacement
Remplacement par des expressions régulières
Comme -match
, l’opérateur -replace
utilise des expressions régulières pour rechercher le modèle spécifié. Mais contrairement à -match
, il remplace les correspondances par une autre valeur spécifiée.
Syntaxe :
<input> -replace <regular-expression>, <substitute>
L’opérateur remplace tout ou partie d’une valeur par la valeur spécifiée à l’aide d’expressions régulières. Vous pouvez utiliser l’opérateur pour de nombreuses tâches d’administration, telles que le renommage des fichiers. Par exemple, la commande suivante remplace les extensions de nom de fichier de tous les .txt
fichiers par .log
:
Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }
Par défaut, l’opérateur -replace
ne respecte pas la casse. Pour qu’il respecte la casse, utilisez -creplace
. Pour le rendre explicitement insensible à la casse, utilisez -ireplace
.
Exemples :
"book" -ireplace "B", "C" # Case insensitive
"book" -creplace "B", "C" # Case-sensitive; hence, nothing to replace
Cook
book
À compter de PowerShell 7.2, lorsque l’opérande gauche d’une -replace
instruction d’opérateur n’est pas une chaîne, cet opérande est converti en chaîne.
PowerShell effectue une conversion de chaîne non sensible à la culture.
Par exemple, si votre culture est définie sur Français (fr), la conversion de chaîne sensible à la culture de la valeur 1.2
est 1,2
.
Avant PowerShell 7.2 :
PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
12
Dans PowerShell 7.2 et versions ultérieures :
PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
1.2
Substitutions d’expressions régulières
Il est également possible d’utiliser des expressions régulières pour remplacer dynamiquement du texte à l’aide de la capture de groupes et des substitutions. Les groupes de capture peuvent être référencés dans la chaîne à l’aide <substitute>
du caractère signe dollar ($
) avant l’identificateur du groupe.
Dans l’exemple suivant, l’opérateur -replace
accepte un nom d’utilisateur sous la forme de DomainName\Username
et se convertit au Username@DomainName
format :
$SearchExp = '^(?<DomainName>[\w-.]+)\\(?<Username>[\w-.]+)$'
$ReplaceExp = '${Username}@${DomainName}'
'Contoso.local\John.Doe' -replace $SearchExp, $ReplaceExp
John.Doe@Contoso.local
Avertissement
Le $
caractère a des rôles syntaxiques dans les expressions PowerShell et régulières :
- Dans PowerShell, entre guillemets doubles, il désigne des variables et agit comme un opérateur de sous-expression.
- Dans les chaînes de recherche Regex, il désigne la fin de la ligne.
- Dans les chaînes de substitution Regex, il désigne les groupes capturés. Veillez à placer vos expressions régulières entre guillemets simples ou à insérer un caractère backtick (
`
) avant elles.
Par exemple :
$1 = 'Goodbye'
'Hello World' -replace '(\w+) \w+', "$1 Universe"
# Output: Goodbye Universe
'Hello World' -replace '(\w+) \w+', '$1 Universe'
# Output: Hello Universe
$$
dans Regex désigne un littéral $
. Ceci $$
dans la chaîne de substitution pour inclure un littéral $
dans le remplacement résultant. Par exemple :
'5.72' -replace '(.+)', '$ $1' # Output: $ 5.72
'5.72' -replace '(.+)', '$$$1' # Output: $5.72
'5.72' -replace '(.+)', '$$1' # Output: $1
Pour plus d’informations , consultez about_Regular_Expressions et substitutions dans les expressions régulières.
Substitution dans une collection
Lorsque l’opérateur <input>
à est -replace
une collection, PowerShell applique le remplacement à chaque valeur de la collection. Par exemple :
"B1","B2","B3","B4","B5" -replace "B", 'a'
a1
a2
a3
a4
a5
Remplacer par un bloc de script
Dans PowerShell 6 et versions ultérieures, l’opérateur -replace
accepte également un bloc de script qui effectue le remplacement. Le bloc de script s’exécute une fois pour chaque correspondance.
Syntaxe :
<String> -replace <regular-expression>, {<Script-block>}
Dans le bloc de script, utilisez la $_
variable automatique pour accéder au texte d’entrée en cours de remplacement et à d’autres informations utiles. Le type de classe de cette variable est System.Text.RegularExpressions.Match.
L’exemple suivant remplace chaque séquence de trois chiffres par les caractères équivalents. Le bloc de script s’exécute pour chaque jeu de trois chiffres qui doit être remplacé.
"072101108108111" -replace "\d{3}", {return [char][int]$_.Value}
Hello
Opérateurs de confinement
Les opérateurs de confinement (-contains
, -notcontains
, -in
et -notin
) sont similaires aux opérateurs d’égalité, sauf qu’ils retournent toujours une valeur booléenne , même lorsque l’entrée est une collection. Ces opérateurs cessent de comparer dès qu’ils détectent la première correspondance, tandis que les opérateurs d’égalité évaluent tous les membres d’entrée. Dans une collection très volumineuse, ces opérateurs retournent plus rapidement que les opérateurs d’égalité.
-contains et -notcontains
Syntaxe :
<Collection> -contains <scalar-object>
<Collection> -notcontains <scalar-object>
Ces opérateurs indiquent si un jeu inclut un certain élément. -contains
renvoie true lorsque le côté droit (scalaire-object) correspond à l’un des éléments du jeu. -notcontains
retourne la valeur False à la place.
Exemples :
"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
Exemples plus complexes :
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
"ContosoDHCP","ContosoWSUS"
$thisComputer = "ContosoDC2"
$DomainServers -contains $thisComputer
# Output: True
Lorsque l’opérande de droite est une collection, ces opérateurs convertissent la valeur en sa représentation sous forme de chaîne avant de la comparer à la collection de gauche.
$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 et -notin
Syntaxe :
<scalar-object> -in <Collection>
<scalar-object> -notin <Collection>
Les -in
opérateurs et -notin
ont été introduits dans PowerShell 3 en tant qu’inverse syntaxique des opérateurs de -contains
et -notcontains
. -in
renvoie true lorsque le côté <scalar-object>
gauche correspond à l’un des éléments de la collection. -notin
retourne la valeur False à la place.
Les exemples suivants font la même chose que les exemples pour -contains
et -notcontains
le font, mais ils sont écrits avec -in
et -notin
à la place.
"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
Exemples plus complexes :
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
"ContosoDHCP","ContosoWSUS"
$thisComputer = "ContosoDC2"
$thisComputer -in $DomainServers
# Output: True
Lorsque l’opérande de gauche est une collection, ces opérateurs convertissent la valeur en sa représentation de chaîne avant de la comparer à la collection de droite.
$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
Comparaison de types
Les opérateurs de comparaison de types (-is
et -isnot
) sont utilisés pour déterminer si un objet est un type spécifique.
Syntaxe :
<object> -is <type-reference>
<object> -isnot <type-reference>
Exemple :
$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