Gestion avancée des fichiers
Introduction
Il est fréquent lorsque l’on fait du scripting (peu importe le langage) d’utiliser un ou plusieurs fichiers. La plupart du temps, il s’agit de fichier plat. Sous des distributions de type Unix/Linux, ce cas est plus que fréquent. Dans les premières versions de PowerShell, certaines fonctionnalités manquaient cruellement dans les tâches quotidiennes. Il n’était pas rare de devoir réaliser un certain nombre de fonctions en appelant directement des objets du framework .NET. Heureusement, la version 5.0 de PowerShell amène des commandes natives permettant une meilleure gestion des fichiers et de tout ce qui tourne autour.
Dans ce chapitre, nous allons aborder les nouveautés de PowerShell 5.1 en termes de gestion de fichiers. Nous expliquerons comment compresser et décompresser une archive simplement. Mais également, comment gérer les liens symboliques sur des fichiers ou dossiers, ce qui n’était pas évident avant. Nous détaillerons aussi la création de fichiers temporaires lors de l’utilisation de scripts. Enfin, nous terminerons sur l’utilisation de sessions PowerShell pour transférer un ensemble de fichiers et éditer un fichier distant à l’aide de PowerShell ISE.
Gestion de l’archivage
Les archives au format ZIP sont monnaie courante lorsque l’on commence à scripter. On regroupe des fichiers de logs dans une archive pour économiser de la place. Ou bien, on réalise un export d’un grand nombre de fichiers, et pour faciliter la récupération de ces fichiers, on les place dans une archive. C’est ce qui va être vu maintenant. Nous verrons ensuite comment procéder pour les versions antérieures à la 5.1 de PowerShell et nous pourrons ainsi constater la simplicité qui nous est offerte avec l’utilisation des nouvelles commandes PowerShell.
1. Compress-Archive
La commande permettant de réaliser des archives ZIP depuis un dossier ou bien un ensemble de fichiers est Compress-Archive. Elle est assez simple d’utilisation et ne dispose que de quelques paramètres :
Paramètre |
Description |
Path [string[]] |
Indique le chemin du dossier ou des fichiers à compresser. Ce paramètre accepte les wildcards. |
DestinationPath [string] |
Indique le chemin de l’archive ZIP. Si l’extension .ZIP est omise, la commande l’ajoute automatiquement. |
Update [switch] |
Indique si les fichiers sont à ajouter dans une archive existante. Dans le cas contraire, l’archive est écrasée. |
CompressLevel <Optimal, NoCompression, Fastest> |
Indique le niveau de compression de l’archive. Par défaut, la valeur est Optimal. |
Force [switch] |
Indique si l’exécution de la commande doit être forcée, afin d’éviter toute demande de confirmation à l’utilisateur. |
L’API .NET utilisée par la commande Compress-Archive donne toutefois une restriction à l’archivage. La taille maximum d’un fichier pouvant être compressé est limitée à 2 Go.
Soit le dossier nommé MyFolderLogs présent sous C:\Temp. Il contient un grand nombre de logs que l’on veut compresser dans l’archive horodatée C:\Temp\ArchiveLogs<yyyy-MM-dd-hhmm>.ZIP.
On écrit donc :
PS > $DateTime = Get-Date -Format 'yyyy-MM-dd-hhmm' ...
Lien symbolique
Tout comme les archives, rien n’a été implémenté pour gérer les liens symboliques de manière native. Mais depuis la version 5 de PowerShell, les choses ont changé. La commande New-Item accepte le terme SymbolicLink sur le paramètre -ItemType pour créer des liens symboliques sur des dossiers ou des fichiers.
1. Fichiers
Aussi étrange que cela puisse paraître, pour créer un lien symbolique via la commande New-Item, il est nécessaire d’avoir une élévation de privilèges. Les actions qui suivent sont donc lancées depuis une console PowerShell exécutée en tant qu’administrateur.
Création d’un lien symbolique
Dans cet exemple, on crée un lien sur un fichier de logs :
PS > New-Item -ItemType SymbolicLink -Path C:\Temp `
-Name log1.lnk -value C:\Temp\MyFolderLogs\log1.log
Répertoire : C:\temp\.
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 23/03/2018 19:44 0 log1.lnk
Le paramètre -ItemType indique qu’il s’agit d’un lien symbolique. Le paramètre -Path, indique l’emplacement où doit être créé le lien symbolique. Le paramètre -Name a pour valeur le nom du lien. Enfin, le paramètre -Value indique le chemin du fichier vers lequel le lien symbolique pointe. Il peut s’agir d’un chemin complet ou d’un chemin relatif.
La propriété Mode dispose d’un élément supplémentaire dans le cas d’un lien symbolique. En effet, le champ se termine par un l, contrairement à un fichier standard où on a un tiret (-).
Suppression d’un lien symbolique
La suppression d’un lien symbolique sur un fichier se déroule de la même manière...
Fichier temporaire
Lorsque l’on scripte, on peut être amené à écrire des informations de manière temporaire pour les traiter plus loin dans le script. Il peut être fastidieux de gérer ce genre de cas : on crée un fichier temporaire avec un nom aléatoire et on supprime ce fichier à la fin du script. Depuis la version 5 de PowerShell, la commande New-TemporaryFile permet de créer un fichier temporaire stocké dans $env:temp. Il s’agit d’un dossier temporaire présent dans le dossier AppData de l’utilisateur courant. Le nom du fichier temporaire a le format suivant : temp<XXXX>.tmp. Les caractères X sont hexadécimaux et générés aléatoirement.
La commande New-TemporaryFile ne dispose pas de paramètres particuliers. L’appel simple de la commande génère un fichier, et la sortie de la commande est l’objet de ce fichier.
Exemple
PS > New-TemporaryFile
Répertoire : C:\Users\Nicolas\AppData\Local\Temp
Mode LastWriteTime Length Name
---- ------------- ------...
Édition de fichiers distants
Il est souvent pénible de devoir procéder à la modification de fichiers sur des systèmes distants. Habituellement, on se connecte à distance sur l’ordinateur et on édite les fichiers à l’aide de l’éditeur de fichier à disposition. L’autre option est d’accéder au partage administratif de la machine et d’éditer les fichiers avec son éditeur favori.
Grâce à PowerShell version 5.1, une nouvelle méthode est offerte. Il est maintenant possible d’éditer un fichier texte à travers une session PowerShell depuis PowerShell ISE. L’édition du fichier se réalise grâce à l’utilitaire PSEdit.exe. Ce dernier doit être utilisé dans une session interactive depuis PowerShell ISE. Pour plus d’informations sur les sessions PowerShell distantes, référez-vous au chapitre Gestion à distance avancée.
Pour entrer en session interactive, on utilise la commande Enter-PSSession. Avec cette dernière, il est possible de partir d’une session déjà existante avec le paramètre -PSSession, ou bien d’en créer une nouvelle avec le paramètre -ComputerName.
Depuis PowerShell 5.1, il est possible de créer des sessions sur une machine virtuelle d’un hyperviseur Hyper-V....
Copie de fichiers à travers une session PowerShell
L’une des fonctionnalités manquantes des sessions distantes PowerShell était la possibilité de transférer un ou plusieurs fichiers de manière simple et sécurisée. Là où le protocole SSH sous Linux pouvait le faire. Les concepteurs de PowerShell ont donc revu leur copie, et la version 5.1 a été dotée de cette possibilité.
La commande Copy-Item se pare de deux nouveaux paramètres :
-
FromSession : pour indiquer que le fichier source est situé sur le système distant et que la destination est sur le système local.
-
ToSession : pour indiquer que le fichier source est situé sur le système local et que la destination est le système distant.
Bien évidemment, ces deux paramètres appartiennent à un jeu différent, ils ne peuvent donc pas être utilisés dans la même commande. Ils acceptent les objets de type PSSession créés à l’aide de la commande New-PSession (voir le chapitre Gestion à distance avancée).
On crée une session PowerShell :
PS > $Session = New-PSSession -ComputerName SRVDC02
On copie un fichier depuis l’hôte local vers le système distant. Pour que la commande soit plus parlante, on ajoute le paramètre -Verbose :
PS >...
Conversion d’un fichier plat en objet
Dans le monde Unix/Linux, il n’est pas rare de voir des fichiers texte formatés d’une manière bien précise. Il s’agit alors de fichiers de configuration ou encore de fichiers de logs. On peut être amené à traiter ces fichiers en quantité importante, pour du reporting, pour vérifier la cohérence des données, ou encore pour réaliser des exports de configuration d’un système à un autre (exemple : DHCP sous Windows vers DHCP sous Linux). Mais traiter ces fichiers peut s’avérer ennuyeux. On utilise alors un nombre important d’expressions régulières qui finissent par donner le vertige quand on manque de pratique. Pour nous faciliter la tâche, une nouvelle commande a vu le jour sous PowerShell V5. Il s’agit de ConvertFrom-String. On peut l’utiliser de deux manières. La première est basique et se rapproche beaucoup des commandes Import-Csv et Convert-Csv. La seconde est plus complexe. Elle se base sur le framework FlashExtract mis au point par une cellule du centre de recherche Microsoft. À l’aide d’exemples, FlashExtract extrait les données d’un fichier semi-structuré. La sortie de l’extraction est représentée sous forme d’objet. Nous allons dans un premier temps présenter quelques cas de la méthode basique pour ensuite se concentrer sur la méthode complexe. Une fois cette dernière maîtrisée, il vous sera possible d’abandonner (en partie) l’utilisation des expressions régulières.
1. Mode basique
Dans son utilisation la plus simpliste, ConvertFrom-String base sa délimitation de chaîne de caractères sur les espaces et génère des noms de propriétés aléatoires.
Exemple
PS > 'PowerShell est sous Linux' | ConvertFrom-String
P1 P2 P3 P4
-- -- -- --
PowerShell est sous Linux
Si un cinquième mot avait été inscrit, l’affichage serait passé en format liste. On applique ici le formatage par défaut (voir le chapitre Objets personnalisés...