06/12/2024

PowerShell

PowerShell : manipuler les chaînes de caractères avec IndexOf et LastIndexOf

I. Présentation

Dans ce tutoriel, nous allons voir comment utiliser les méthodes IndexOf et LastIndexOf de PowerShell pour extraire une sous-chaîne (substring) d'une chaîne de caractères.

Précédemment, et sur le même thème, nous avions vu comment utiliser les méthodes Split() et Substring() de PowerShell. Avec IndexOf et LastIndexOf, nous allons pouvoir aller un peu plus loin dans l'utilisation de Substring() notamment.

II. PowerShell et IndexOf

La méthode IndexOf() permet de rechercher la position d'un caractère ou d'une chaîne au sein d'une chaîne de caractères. Elle va retourner la position de la première occurrence du caractère recherché ou de la chaîne recherchée. Ni plus ni moins.

Prenons un exemple avec la variable $URL :

$URL = "www.it-connect.fr"

Recherchons la position du caractère "." :

$URL.IndexOf(".")

On peut voir que la commande retourne "3", tout simplement. Cela signifie que le point a été trouvé à la position "3" de la chaîne de caractères. Ce qui est correct puisque le premier caractère de la chaîne correspond à l'index 0.

PowerShell et IndexOf()
PowerShell et IndexOf()

Comme je le disais, on peut également rechercher une chaîne de caractères. Par exemple, on peut rechercher "it" :

$URL.IndexOf("it")

Cette commande va retourner la valeur "4" : c'est bien le "i" qui est en 4ème position, ce qui correspond au début de la chaîne recherchée.

Si l'on recherche une chaîne et qu'elle n'a pas été trouvée, la valeur retournée sera "-1". La preuve en image :

Il faudra retenir que IndexOf() recherche la première occurrence la chaîne recherchée, en partant de l'index 0, de la gauche vers la droite.

III. PowerShell et LastIndexOf

La méthode LastIndexOf() permet de rechercher la dernière position d'un caractère ou d'une chaîne au sein d'une chaîne de caractères. La différence avec IndexOf() est subtile, mais importante : LastIndexOf recherche la dernière occurrence d'un caractère, et non pas la première.

Reprenons l'exemple précédent avec la variable $URL :

$URL = "www.it-connect.fr"

Puis, cette fois-ci, utilisons LastIndexOf :

$URL.LastIndexOf(".")

On peut voir que la commande retourne le résultat "14" : ce qui correspond à la position du point de ".fr".

PowerShell et LastIndexOf()
PowerShell et LastIndexOf()

Dans le même esprit, nous pouvons rechercher une chaîne de plusieurs caractères et dans le cas où la chaîne est introuvable, le résultat "-1" sera retourné.

IV. PowerShell : exemples d'utilisation IndexOf et LastIndexOf

Maintenant que nous avons à quoi servait IndexOf() et LastIndexOf(), il est temps de voir ce que ça peut donner dans la pratique !

A. PowerShell : extraire une chaîne comprise entre deux caractères

Reprenons notre variable $URL :

$URL = "www.it-connect.fr"

L'objectif va être le suivant : récupérer la chaîne comprise entre le premier point et le tiret. Autrement dit, obtenir la valeur "it".

Commençons par récupérer la position du premier point :

$Debut = $URL.IndexOf(".")

Résultat : la variable $Debut est égale à 3.

Et celle du tiret :

$Fin = $URL.LastIndexOf("-")

Résultat : la variable $Fin est égal à 6.

Maintenant que l'on connaît le point de départ dans la chaîne et la fin, il faut que l'on récupère ce qu'il y a entre deux. Pour cela, nous allons utiliser la méthode Substring().

Pour rappel, Substring() permet d'extraire une sous-chaîne d'une chaîne de caractères en précisant : l'index de départ (StartIndex) et le nombre de caractères après cet index.

On peut considérer que :

  • Le point de départ, ce sera "$Debut+1" : il faut ajouter +1 car sinon nous allons récupérer le "." puisque $Debut contient la position du point.
  • Le nombre de caractères à conserver, ce sera "$Fin-$Debut-1" : voilà, je vous ai perdu. Explications : pour savoir combien il y a de caractères à extraire, il suffit de faire une soustraction "$Fin - $Debut" (= 3) puisque cela donne l'écart entre les deux points de référence. Enfin, on fait "-1" en complément pour éliminer le caractère de référence ("-") sur le même principe qu'avec $Debut. On obtient donc : 2, soit 2 caractères à extraire.

Si l'on traduit tout cela en PowerShell, on obtient la ligne suivante :

$URL.Substring($Debut+1,$Fin-$Debut-1)

On obtient bien la valeur "it" en retour, cela fonctionne ! Vous pouvez vous amuser à tester avec d'autres combinaisons.

Dans le cas où l'on aurait recherché la chaîne comprise entre les deux points, on aurait pu le faire avec avec Split() en récupérant le deuxième membre (index 1) du tableau obtenu :

($URL.Split("."))[1]

Ce que nous venons de voir est peut-être l'exemple le plus "puissant" avec IndexOf(), LastIndexOf() et Substring(). Si vous en connaissez d'autres, n'hésitez pas à les partager en commentaire !

B. Extraire une chaîne par la gauche

En combinant l'utilisation de Substring() et IndexOf() ou LastIndexOf(), on peut extraire une partie d'une chaîne en partant du début. L'idée est la suivante : extraire le sous-domaine de notre URL, donc tout ce qui est avant le premier point.

$URL = "www.it-connect.fr"

On récupère la position du premier point :

$Debut = $URL.IndexOf(".")

Ensuite, avec Substring() on part du premier caractère correspond à l'index 0 et on récupère le nombre de caractères définit dans $Debut. Comme on part de l'index 0, il n'est pas nécessaire de faire +1.

Ce qui donne :

$URL.Substring(0,$Debut)

Résultat, j'obtiens la valeur "www" : c'est correct !

Ce tutoriel sur IndexOf() et LastIndexOf() touche à sa fin, vous avez deux cordes supplémentaires à votre arc lorsqu'il s'agit de manipuler les chaînes de caractères en PowerShell. Je dois avouer que Split() et Substring() restent ceux que j'utilise le plus souvent.

author avatar
Florian BURNEL Co-founder of IT-Connect
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.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “PowerShell : manipuler les chaînes de caractères avec IndexOf et LastIndexOf

  • Merci pour ce tuto !! Toujours très clair !
    Au dela de l’extraction expliquée dans ce tuto , quelle serait la procédure si on souhaitait ajouter une chaîne de caractères dans une autre chaîne de caractères ?

    Répondre
  • salut,

    en testant la commande j’ai reçu ce message d’erreur:
    Échec lors de l’appel de la méthode, car [System.IO.FileInfo] ne contient pas de méthode nommée « LastIndexof ».
    Au caractère Ligne:5 : 5
    + $Position = $CurrentFolder1.LastIndexOf(« \ »)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation : (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
    comment régler cela?

    merci d’avance.

    Répondre

Laisser un commentaire

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.