Accélérer l’écriture de ses fichiers Powershell

Lors de la présentation du couple Azure Graph / Powershell à l’occasion d’un Meetup organisé par l’équipe du Worplace Ninja France (https://www.linkedin.com/company/wpninjasfra/) et dont la vidéo est disponible à cet endroit https://www.youtube.com/watch?v=dv6_sxMzch8, l’un des participants a partagé son expérience.

Il a des soucis sur une requête qui remonte quelques milliers d’utilisateurs et qu’il envoi dans un fichier pour exploiter les résultats. Pas d’inquiétude, je n’ai aucun doute sur la vitesse d’obtention des résultats côté Graph / Powershell, mais plutôt un doute sur la façon dont les données sont envoyées dans le fichier.

La commande par défaut côté Powershell est Out-File qui récupère la sortie de commande et ajoute les résultats dans un fichier. Sous cette forme par exemple :

blablamasortie | out-file c:\temp\titimeasure.txt -append

Ça marche, c’est tout à fait utilisable sur de petits volumes de données ou le temps de création du fichier n’est pas un obstacle même s’il prend quelques secondes. Mais qu’en est-il dès qu’il s’agit de plusieurs milliers de lignes ? Pour cela, création d’un fichier de 100 000 lignes avec en complément l’utilisation de la commande Measure-Command (qui donne le temps d’exécution du script).

Voici pour le premier test :

measure-command {
$titi = 1 .. 100000
foreach ($toto in $titi)
{
$toto| out-file c:\temp\titimeasure.txt -append
}}

Résultat moyen avec + de 6 minutes 40 secondes pour écrire les 100 000 lignes dans le fichier txt.

Le second test va s’appuyer sur une autre solution avec la classe StreamWriter (Doc éditeur : https://learn.microsoft.com/en-us/dotnet/api/system.io.streamwriter?view=net-7.0/?WT.mc_id=AZ-MVP-5003759).

measure-command {
$titi = 1 .. 100000
$stream =[System.IO.StreamWriter]::new("C:\temp\titimeasure2.txt")
foreach ($toto in $titi)
{
$stream.WriteLine($toto)
}}
$stream.close()

Même demande donc avec l’envoi dans un fichier de 100 000 lignes avec des valeurs allant de 1 à 100 000.

Et ce n’est pas du tout la même chose !

184 millisecondes !

Alors pour ce genre de besoin, le couple Graph / Powershell sera efficacement épaulé par StreamWriter !