15/11/2024

Comparer des objets avec Compare-Object

I. Présentation

La commande PowerShell "Compare-Object" est très pratique pour comparer deux objets, comme deux variables, le contenu de deux fichiers ou encore le contenu entre deux dossiers. Il m'est arrivé à plusieurs reprises d'utiliser cette commande pour comparer deux fichiers CSV.

Lorsque nous comparons deux objets avec "Compare-Object", la commande retourne :

  • Les éléments identiques entre les deux fichiers
  • Les éléments présents dans l'objet de référence, mais absents dans le second objet
  • Les éléments absents dans l'objet de référence, mais présents dans le second objet

Vous l'aurez compris, dans ce chapitre, vous allez apprendre à comparer deux objets en PowerShell avec "Compare-Object".

II. Compare-Object : comparer deux chaînes de caractères

Le cmdlet "Compare-Object" peut, tout simplement, comparer deux chaînes de caractères. Cela va nous permettre de bien appréhender la syntaxe de cette commande.

Pour comparer deux chaînes, il suffit de les préciser à la suite de "Compare-Object" :

Compare-Object "www.it-connect.fr" "IT-Connect"

Dans le cas où les chaînes seraient égales, la commande ne va rien retourner. Si l'on veut inclure les éléments égaux, il faut ajouter le paramètre "-IncludeEqual".

Compare-Object "www.it-connect.fr" "WWW.IT-CONNECT.FR" -IncludeEqual

Comme nous pouvons le constater avec cet exemple, la comparaison ne tient pas compte de la casse. Si elle est importante, nous pouvons ajouter le paramètre "-CaseSensitive" pour tenir compte de la casse.

Compare-Object "www.it-connect.fr" "WWW.IT-CONNECT.FR" -IncludeEqual -CaseSensitive

Ce qui donne :

Compare-Object

Suite à cette introduction, passons maintenant à un exemple beaucoup plus utile : la comparaison de fichiers CSV avec PowerShell et "Compare-Object".

III. Compare-Object : comparer deux CSV

Pour cet exemple, nous allons utiliser les deux fichiers CSV suivants :

  • CSV1.csv
Pays;
France;
Costa Rica;
Canada;
Belgique;
Suisse;
  • CSV2.csv
Pays;
France;
Costa Rica;
Espagne;
Belgique;
Islande;
Colombie;

Chaque fichier CSV contient une seule colonne nommée "Pays", mais nous pourrions avoir plusieurs colonnes. Nous allons comparer ces deux fichiers pour identifier facilement les différences.

Nous allons commencer par importer le contenu de nos fichiers CSV dans les variables "$CSV1" et "$CSV2". Pour cela, nous utilisons le cmdlet "Import-CSV" puisqu'il assure cette fonction.

$CSV1 = Import-CSV "C:\TEMP\CSV1.csv" -Delimiter ";"
$CSV2 = Import-CSV "C:\TEMP\CSV2.csv" -Delimiter ";"
 

Ensuite, nous allons comparer la variable "$CSV1" et la variable "$CSV2". Le fichier CSV1 sera notre objet de référence, nous allons l'associer au paramètre "-ReferenceObject" alors que l'objet de "différence" sera le fichier CSV2. Il faut également spécifier la propriété sur laquelle se baser pour faire la comparaison, ici, ce sera notre colonne "Pays".

Ce qui donne la commande suivante :

Compare-Object -ReferenceObject $CSV1 -DifferenceObject $CSV2 -Property Pays

Le résultat suivant est obtenu :

Compare-Object CSV

La propriété "SideIndicator" permet de savoir de quel côté est présente la valeur :

  • "=>" : fait référence à une valeur présente dans le "-DifferenceObject" (CSV2), mais absente dans le "-ReferenceObject" (CSV1)
  • "<=" : fait référence à une valeur présente dans le "-ReferenceObject" (CSV1), mais absente dans le "-DifferenceObject" (CSV2)

Si nous voulons connaître seulement les valeurs présentes dans le fichier CSV1, mais absentes du fichier CSV2, nous pouvons ajouter un filtre basé sur la valeur de la propriété "SideIndicator" grâce à "Where-Object".

Compare-Object -ReferenceObject $CSV1 -DifferenceObject $CSV2 -Property Pays | Where-Object { $_.SideIndicator -eq "<=" }

Pour l'inverse, il suffit de changer le sens de la flèche dans le filtre.

Nous pouvons également afficher seulement les valeurs communes entre les deux fichiers en ajoutant le paramètre "-ExcludeDifferent" pour exclure les valeurs différentes :

Compare-Object -ReferenceObject $CSV1 -DifferenceObject $CSV2 -Property Pays -ExcludeDifferent

Sachez qu'il est possible de comparer plusieurs colonnes, et pas uniquement une seule comme ici avec la colonne "Pays". Une ligne peut alors ressortir plusieurs fois (dans les deux sens) s'il y a la valeur d'une colonne qui change dans un fichier, mais pas dans l'autre.

Voici un exemple en image avec l'ajout de la colonne "Continent" dans nos fichiers CSV. Dans cet exemple, pour le pays "Colombie", la valeur du continent évolue entre les deux fichiers, donc la ligne ressort une fois dans le sens "=>" et une seconde fois dans l'autre sens "<=".

IV. Compare-Object : comparer le contenu de deux dossiers

Pour finir cette découverte de "Compare-Object", prenons un autre cas concret : comparer le contenu de deux dossiers. Le but : identifier les fichiers présents dans un dossier, mais pas dans l'autre.

Voici les deux dossiers qui sont utilisés pour cet exemple :

Commençons par récupérer la liste des éléments avec récursivité via la commande "Get-ChildItem".

$DOSSIER1 = Get-ChildItem "C:\TEMP\DOSSIER1\" -Recurse
$DOSSIER2 = Get-ChildItem "C:\TEMP\DOSSIER2\" -Recurse

Ensuite, nous utilisons la commande "Compare-Object" sur le même principe que précédemment, sans spécifier de propriété.

Compare-Object -ReferenceObject $DOSSIER1 -DifferenceObject $DOSSIER2

Nous obtenons directement les chemins complets vers les fichiers qui sont absents dans un dossier ou l'autre.

Nous pouvons également utiliser le paramètre "-Property" de "Compare-Object" pour comparer les dates de dernière modification des fichiers. Cela nécessite de lire l'attribut "LastWriteTime". Nous ajouterons également le nom du fichier (pas le nom complet) pour ne pas que la sortie contienne seulement la valeur de "LastWriteTime".

Compare-Object -ReferenceObject $DOSSIER1 -DifferenceObject $DOSSIER2 -Property Name,LastWriteTime -IncludeEqual

Ainsi, nous pouvons identifier les fichiers les plus récents plus facilement grâce à ce différentiel.

Maintenant, c'est à vous de jouer ! N'hésitez pas à tester ces différents exemples et à vous exercer sur vos propres dossiers et fichiers.


livre pour apprendre PowerShell
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

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.