Les opérateurs de comparaison
Sommaire
I. Présentation
Les opérateurs de comparaison sont au cœur de nombreux langages, et PowerShell n'échappe pas à cette règle. Ils permettent de comparer des valeurs, ce qui est essentiel et très fréquent dans les scripts, notamment au sein des structures conditionnelles. Dans ce chapitre, nous allons explorer les différents opérateurs de comparaison disponibles en PowerShell.
II. Opérateurs d'égalité
Parmi les nombreux opérateurs de comparaison, il y a les opérateurs dits d'égalité. Ceci va nous permettre de vérifier si une valeur est égale à une autre. En PowerShell, l'opérateur d'égalité est "-eq". D'ailleurs, pour information, c'est l'équivalent de l'opérateur "==" dans d'autres langages. À l'inverse, pour vérifier l'inégalité et vérifier si deux valeurs sont bien différentes, nous devons utiliser l'opérateur "-ne".
Lorsque nous comparons deux valeurs, le résultat est retourné sous la forme d'un booléen : vrai (true) ou (false).
Vous pouvez ouvrir une console et effectuer quelques tests, comme ceux présentés sur l'image suivante. D'ailleurs, ces exemples permettent de se rendre compte d'une chose : par défaut, PowerShell ne tient pas compte de la casse, c'est-à-dire qu'il ne fait pas la différence entre les minuscules et les majuscules. Pour lui, "PowerShell" est égal à "POWERSHELL", tout comme "PowerShell" est égal à "PowerShell", car il retourne "True".
Si nous souhaitons que le test de comparaison considère la casse, alors nous devons ajouter le caractère "c" après le tiret et avant le nom de l'opérateur. Ainsi, l'opérateur "-eq" devient "-ceq". Ceci est valable pour les autres opérateurs. Si nous effectuons des tests similaires avec cet opérateur, nous pouvons voir que les deux dernières comparaisons retournent bien "False" cette fois-ci.
Remarque : pour indiquer explicitement que le test de comparaison doit être insensible à la casse, vous devez indiquer le caractère "i", sur le même principe que le caractère "c". Ainsi, l'opérateur "-eq" devient "-ieq".
Nous n'avons pas cette problématique sur la comparaison de chiffres et nombres, mais c'est un détail important pour les chaines de caractères.
III. Opérateurs de comparaison : supérieur ou inférieur
PowerShell fournit également des opérateurs pour vérifier si une valeur est supérieure ou inférieure à une autre :
Opérateur | Description |
---|---|
-gt Greater than | Supérieur à... |
-ge Greater or equal | Supérieur ou égal à... |
-lt Less than | Inférieur à.... |
-le Less or equel | Inférieur ou égal à... |
Sachez que, là aussi, vous pouvez ajouter un "c" entre le tiret et le nom de l'opérateur pour tenir compte de la casse.
IV. Opérateurs de comparaison : ressemblance
Parmi les opérateurs de comparaison de PowerShell, il y a des opérateurs permettant de rechercher une correspondance plus ou moins proches entre deux valeurs. L'idée étant de rechercher la présence d'une chaîne de caractères dans une autre chaîne, sans que celle-ci soit exactement la même. Autrement dit, elle peut être présente sans représenter la chaîne complète.
Opérateur | Description |
---|---|
-like | Correspond à... |
-notlike | Ne correspond pas à... |
Là encore, le test retourne vrai ou faux en fonction du résultat. Voici quelques exemples :
Nous pouvons voir que "PowerShell" correspond bien à "Power*" mais qu'il ne correspond pas à "ower*", ni à "ower", alors qu'il y a quand même une ressemblance. La puissance des opérateurs "-like" et "-notlike" se situe dans l'utilisation des caractères "*" (que l'on appelle wildcard) et "?".
- Le caractère "*" peut être remplacé par n'importe quel caractère, que ce soit 1 ou plusieurs caractères
- Le caractère "?" peut être remplacé par n'importe quel caractère, mais un seul caractère
Lorsque PowerShell nous indique que "PowerShell" ne correspond pas à "ower*", c'est donc normal. Pour lui, le premier caractère de la chaine doit être "o", et non "P". Si l'on souhaite qu'il considère le "P", nous devons ajouter un caractère de substitution ("*" ou "?").
Nous voyons bien la différence :
L'opérateur "-like" peut s'avérer très pratique dans une structure conditionnelle (if/else) ou dans un filtre avec Where-Object. Par exemple, si vous recherchez tous les fichiers présents dans le répertoire "D:\Documents" dont le nom contient le mot clé "Tutoriel", vous pouvez utiliser cette commande :
Get-ChildItem -Path "D:\Documents" | Where-Object { $_.Name -like "*Tutoriel*" }
L'opérateur "-NotLike" fonctionne sur le même principe, mais à l'inverse ("ne correspond pas").
Pour aller plus loin et créer des modèles de correspondances plus complexes, vous pouvez étudier ces deux opérateurs :
Opérateur | Description |
---|---|
-match | Correspond à l'expression régulière... |
-notmatch | Ne correspond pas à l'expression régulière... |
Ces opérateurs acceptent des modèles de correspondance que l'on appelle "pattern" et qui correspondent à des expressions régulières (RegEx). Bien que ce soit très puissant, ce n'est pas une notion évidente à appréhender.
Si vous souhaitez approfondir cette notion par la suite, consultez cet article :
V. Opérateurs de comparaison : contient ou ne contient pas
Pour finir, nous allons évoquer 4 opérateurs de comparaison dont l'objectif va être de vérifier si une valeur est présente dans une collection, ou à l'inverse si la collection contient la valeur. Le terme collection faisant référence à un ensemble de valeurs. Tout est question de logique, en fait.
Voici les 4 opérateurs auxquels nous faisons référence :
Opérateur | Description |
---|---|
-contains | La collection contient la valeur |
-notcontains | La collection ne contient pas la valeur |
-in | La valeur est présente dans la collection |
-notin | La valeur n'est pas présente dans la collection |
Nous allons effectuer quelques tests avec ces opérateurs pour que vous puissiez bien comprendre leur fonctionnement.
Tout d'abord, nous allons créer un tableau avec plusieurs valeurs :
$Langages = @("PowerShell","Python","Bash","MS-DOS")
Puis, nous cherchons à vérifier si la valeur "PowerShell" est présente dans le tableau stocké dans la variable $Langages. Nous pouvons utiliser "-contains" et "-in" pour cela.
$Langages -contains "PowerShell"
Puis, avec le second opérateur :
"PowerShell" -in $Langages
À chaque fois, nous obtenons le résultat "True" car c'est bien le cas : PowerShell est présent dans le tableau de valeurs. Néanmoins, soyez vigilant à l'endroit où vous placez vos valeurs pour ne pas avoir un résultat inattendu.
Le fait de traduire le test que nous cherchons à effectuer peut être utile. Par exemple :
$Langages -contains "PowerShell"
Ce qui donne : "Est-ce que $Langages contient PowerShell ?", ceci correspondant bien au test que nous souhaitons effectuer. Si l'on remplace "-contains" par "-in" sans inverser les variables, ceci donnerait : "Est-ce que $Langages est présent dans PowerShell ?" - Là, quelque chose ne va pas, c'est pour cette raison que les deux variables doivent être inversées.
Au lieu d'utiliser un tableau statique, nous pouvons obtenir cette collection à partir du résultat d'une commande. Par exemple, si nous stockons dans une variable la liste des utilisateurs locaux, nous pouvons ensuite rechercher la présence d'un utilisateur dans cette liste.
$Utilisateurs = (Get-LocalUser).Name
"Florian" -in $Utilisateurs
# ou
$Utilisateurs -contains "Florian"
VI. Conclusion
Vous avez désormais connaissance des différents opérateurs de comparaison disponibles avec PowerShell. Plusieurs cas d'usage nécessitent de les utiliser, notamment lors de l'écriture d'un filtre avec "Where-Object" ou dans une structure conditionnelle (if/else).