PowerShell : les opérateurs -like et -notlike

I. Présentation

PowerShell propose différents opérateurs, certains pour comparer des valeurs numériques, d'autres pour vérifier si deux valeurs sont identiques, ou encore pour tester un booléen.

Il y a aussi les opérateurs -like et -notlike en PowerShell qui sont très pratique pour réaliser un filtre plus large grâce à la notion de wildcard. L'idée c'est plutôt 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 : elle peut être présente sans représenter la chaîne complète. Nous allons voir différents exemples, ce sera plus facile à comprendre...

Tutoriel disponible au format vidéo :

Voici une liste de fichiers que l'on prendra pour exemple pour la suite de cet article :

II. PowerShell et -like

Bien souvent, nous utilisons ces deux opérateurs dans une boucle, une condition if, ou encore avec Where-Object. D'ailleurs, les exemples qui suivent s'appuient sur Where-Object (Where) mais la syntaxe de -like reste toujours la même.

Pour rechercher tous les éléments du dossier courant qui ont la chaîne "test" dans leur nom, voici la commande :

Get-ChildItem | Where { $_.Name -like "*test*" }

Dans l'exemple précédent, le fait d'ajouter "*" sert de wildcard pour préciser qu'il peut y avoir des valeurs avant ou après (peu importe le type de valeurs et le nombre de valeurs). C'est la syntaxe à utiliser pour rechercher simplement la chaîne "test", peu importe sa position dans le nom des éléments.

Maintenant, si l'on veut rechercher tous les fichiers dont le nom commence par la chaîne "test", on va devoir indiquer qu'un seul astérisque puisque l'on ne veut pas de caractères avant notre chaîne. Vous verrez que le résultat retourne bien seulement les fichiers qui commencent par test, et que le fichier "Six Test.txt" n'est plus dans la liste retournée, tout comme "Sept TEST test.txt". Ce qui donne :

Get-ChildItem | Where { $_.Name -like "test*" }

Par défaut, la commande n'est pas sensible à la casse. Les trois exemples ci-dessus vont retourner exactement le même résultat :

Get-ChildItem | Where { $_.Name -like "*test*" }
Get-ChildItem | Where { $_.Name -like "*TEST*" }
Get-ChildItem | Where { $_.Name -like "*tESt*" }

Si l'on veut préciser explicitement que le filtre n'est pas sensible à la casse, on peut utiliser -ilike plutôt que -like mais le résultat sera le même :

Get-ChildItem | Where { $_.Name -ilike "*test*" }

Pour rendre la recherche sensible à la casse, l'opérateur -clike doit être utilisé. Rien d'autre ne change.

Get-ChildItem | Where { $_.Name -clike "*test*" }

Si l'on sait qu'il y a un caractère qui peut changer dans la chaîne, on peut le remplacer par "?" dans la chaîne de référence. Par exemple, dans ma liste j'ai des noms de fichiers avec "test", "tost" et "tust". Je vais donc adapter la chaîne de référence utilisée par mon -like comme ceci :

Get-ChildItem | Where { $_.Name -like "*t?st*" }

Nous pouvons aussi utiliser l'opérateur -like (et les variantes) de façon autonome, le résultat retourné sera alors booléen. Voici un exemple :

"www.it-connect.fr" -like "*it-connect*"

Passons maintenant à la découverte de -notlike.

III. PowerShell et -notlike

L'opérateur -notlike fonctionne de la même façon que -like mais les résultats qu'il va retourner sont exactement à l'inverse de -like. En effet, là on va plutôt essayer de filtrer les résultats pour exclure les valeurs qui contiennent la chaîne de référence.

Exactement l'inverse que toute à l'heure :

Get-ChildItem | Where { $_.Name -notlike "*test*" }

Vous devez vous en douter, l'opérateur -notlike a également deux variantes : -inotlike et -cnotlike.

Voici un exemple :

Get-ChildItem | Where { $_.Name -cnotlike "*test*" }

Dans les conditions, il est bien entendu possible de coupler l'utilisation de -like et -notlike (et leurs variantes), que l'on pourra coupler également avec -and, -or, etc. L'intérêt est de réaliser un filtre encore plus fin.

Voici un exemple :

Get-ChildItem | Where { $_.Name -like "Test*" -and $_.Name -cnotlike "*TEST*"}

Ce sera le mot de la fin, maintenant à vous de mettre ces exemples en pratique !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5500.Voir tous les posts

2 thoughts on “PowerShell : les opérateurs -like et -notlike

  • Bon petit article sur les opérateurs -like et associés.

    Bientôt le même sur l’opérateur -match ?

    Répondre
  • Bonjour,
    Cela ne déclasse en rien l’excellent travail de Florian mais n’oubliez pas l’aide mémoire intégrée de Powershell (get-help, help, man…). Lancez une console PS ou un « Windows Terminal » pour être plus « moderne » 😀
    puis tapez help about_Operators help about_Comparison_Operators
    Bon, c’est en anglais, j’en conviens mais je pense que ça reste compréhensible par un IT 😉
    Ce conseil sur l’usage de l’aide reste valable pour les lecteurs qui nous reprochent parfois un manque d’exemples dans nos articles. (p.ex. Powershell pour les débutants)
    Bien à vous.

    Répondre

Répondre à Christophe Mandin Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.