Lire et écrire des fichiers

PowerShell permet de lire et d'écrire des fichiers texte de différents formats, notamment fichiers textes (brut), CSV, JSON et HTML.

La redirection de commandes vers des fichiers texte (brut)

Par défaut, les commandes PowerShell affichent leurs résultats dans la console. En effet, PowerShell utilise des objets pour représenter les données, mais lorsqu'une commande est exécutée, ces objets sont convertis en texte pour être affichés à l'écran. En fait, la commande Out-Host est implicitement appelée à la fin de chaque pipeline pour afficher les résultats dans la console.

Lorsque nous exécutons la commande Get-Process, par exemple, PowerShell récupère une liste d'objets représentant les processus en cours d'exécution sur le système. Ensuite, ces objets sont convertis en texte et affichés dans la console via Out-Host. Exécuter :

Get-Process

revient à exécuter :

Get-Process | Out-Host

Parfois, au lieu d'afficher les résultats à l'écran, nous souhaitons les enregistrer dans un fichier texte. Pour ce faire, des utilisateurs Unix seraient tentés d'utiliser la redirection de sortie avec le symbole > pour créer ou écraser un fichier, ou >> pour ajouter du contenu à un fichier existant. Cela fonctionne également dans PowerShell, mais ces symboles sont en fait des alias pour la commande Out-File, qui est conçue pour écrire des objets dans un fichier texte.

Par exemple, pour enregistrer la liste des processus dans un fichier texte nommé processus.txt, nous pouvons utiliser la commande suivante :

Get-Process > processus.txt

ou l'équivalent:

Get-Process | Out-File -FilePath processus.txt

Pour ajouter du contenu à un fichier existant, nous utilisons >> ou l'option -Append de Out-File :

Get-Process >> processus.txt

ou

Get-Process | Out-File -FilePath processus.txt -Append

Notez que si le fichier processus.txt n'existe pas, il sera créé. Si le fichier existe déjà, son contenu sera écrasé (avec >), ou le nouveau contenu sera ajouté à la fin du fichier (avec >>).

Il est important de noter que Out-File écrit les objets dans le fichier en les convertissant en texte, ce qui rendra le fichier difficile à réutiliser pour des traitements ultérieurs, car les informations de type et de structure des objets seront perdues. Pour éviter cela, nous utiliserons des fichiers CSV ou JSON que nous verrons plus loin.

Une façon quasi-équivalente d'écrire dans un fichier texte est d'utiliser la commande Set-Content, qui remplace le contenu du fichier par le nouveau contenu, ou Add-Content, qui ajoute du contenu à la fin du fichier. Par exemple :

Get-Process | Set-Content -Path processus.txt

ou

Get-Process | Add-Content -Path processus.txt

À l'inverse, pour lire le contenu d'un fichier texte, nous utilisons la commande Get-Content :

Get-Content -Path processus.txt

Cela lit le contenu du fichier processus.txt. Notez que le contenu est lu en tant que texte brut, sans structure ni type d'objet.

Les fichiers CSV

Les fichiers CSV (Comma-Separated Values) sont des fichiers texte où les données sont organisées en lignes et en colonnes, avec chaque valeur séparée par une virgule (ou un autre délimiteur). Ils sont couramment utilisés pour stocker des données tabulaires et peuvent être facilement importés et exportés entre différents programmes. Les fichiers CSV sont habituellement utilisés pour les feuilles de calcul, les bases de données et les applications de gestion de données. Pour visualiser le contenu d'un fichier CSV, on peut l'ouvrir avec un éditeur de texte ou un tableur comme Microsoft Excel.

Un fichier CSV ressemble à ceci :

Nom,Âge,Ville
Alice,30,Paris
Bob,25,Lyon
Charlie,35,Marseille

Ici, la première ligne contient les en-têtes de colonnes, et chaque ligne suivante représente un enregistrement avec des valeurs séparées par des virgules. Il est possible d'utiliser d'autres délimiteurs, comme le point-virgule ;, la tabulation \t, ou même un espace, bien que la virgule soit la norme.

Exporter des données PowerShell vers un fichier CSV

La structure des objets PowerShell se prête bien à l'exportation vers des fichiers CSV, puisque chaque objet peut être représenté comme une ligne dans le fichier, et chaque propriété de l'objet comme une colonne. Pour exporter des données vers un fichier CSV, nous utilisons la commande Export-Csv. Par exemple, pour exporter la liste des processus en cours d'exécution vers un fichier CSV nommé processus.csv, nous utilisons la commande suivante :

Get-Process | Export-Csv -Path processus.csv -NoTypeInformation

L'option -NoTypeInformation est utilisée pour éviter d'inclure une ligne de type en haut du fichier CSV, ce qui n'est généralement pas nécessaire pour la plupart des applications.

Une des limitations de la conversion en CSV est que les objets imbriqués (c'est-à-dire les propriétés qui sont elles-mêmes des objets) ne sont pas bien gérés. Par exemple, si un objet a une propriété qui est un autre objet, cette propriété sera convertie en une chaîne de caractères dans le fichier CSV, ce qui peut rendre les données difficiles à réutiliser. Pour contourner ce problème, il est souvent préférable de sélectionner uniquement les propriétés simples (c'est-à-dire les propriétés qui sont des chaînes de caractères, des nombres ou des booléens) avant d'exporter les données. Par exemple, pour n'exporter que le nom et l'identifiant des processus, nous pouvons utiliser la commande suivante :

Get-Process | Select-Object -Property ProcessName, Id | Export-Csv -Path processus.csv -NoTypeInformation

Importer des données depuis un fichier CSV

Pour lire des données à partir d'un fichier CSV et les convertir en objets PowerShell, nous utilisons la commande Import-Csv. Par exemple, pour lire les données du fichier processus.csv que nous avons créé précédemment, nous utilisons la commande suivante :

Import-Csv -Path processus.csv

Cela lit le fichier CSV et crée des objets PowerShell avec des propriétés correspondant aux en-têtes de colonnes du fichier. Nous pouvons ensuite manipuler ces objets comme nous le ferions avec n'importe quel autre objet PowerShell. Par exemple, pour afficher uniquement les noms des processus, nous pouvons utiliser la commande suivante :

Import-Csv -Path processus.csv | Select-Object -Property ProcessName

Ainsi, contrairement à Out-File ou Set-Content, l'utilisation de Export-Csv et Import-Csv permet de conserver la structure des données et de faciliter leur réutilisation dans des scripts PowerShell.

Les fichiers JSON

JSON (JavaScript Object Notation) est un format de données léger et facile à lire, utilisé pour représenter des objets et des structures de données. Il est largement utilisé pour l'échange de données entre applications, notamment dans les API web. Un fichier JSON est essentiellement un fichier texte contenant des données structurées sous forme de paires clé-valeur, avec une syntaxe similaire à celle des objets JavaScript. Un fichier JSON ressemble à ceci :

{
  "Nom": "Alice",
  "Âge": 30,
  "Ville": "Paris"
}

Ici, les données sont organisées en paires clé-valeur, où chaque clé est une chaîne de caractères (par exemple, "Nom") et chaque valeur peut être une chaîne de caractères, un nombre, un booléen, un tableau ou un autre objet JSON. En effet, un fichier JSON peut contenir des structures de données complexes, y compris des tableaux et des objets imbriqués. Des objets imbriqués ressemblent à ceci :

{
  "Nom": "Alice",
  "Âge": 30,
  "Adresse": {
    "Rue": "123 Rue Principale",
    "Ville": "Paris",
    "CodePostal": "75001"
  },
  "Téléphones": [
    "0123456789",
    "0987654321"
  ]
}

Ici, les données sont organisées de manière hiérarchique, ce qui permet de représenter des relations complexes entre les différentes entités. Par exemple, l'adresse d'une personne est elle-même un objet JSON contenant plusieurs paires clé-valeur. De même, la liste des numéros de téléphone est représentée comme un tableau JSON, ce qui permet de stocker plusieurs valeurs sous une même clé.

Lors de la conversion d'objets PowerShell en JSON, les propriétés des objets deviennent des clés dans le fichier JSON, et les valeurs des propriétés deviennent les valeurs correspondantes. Lorsqu'une propriété contient un tableau, elle est convertie en un tableau JSON, et lorsqu'une propriété contient un autre objet, elle est convertie en un objet JSON imbriqué.

Exporter des données PowerShell vers un fichier JSON

Pour exporter des données vers un fichier JSON, nous utilisons la commande ConvertTo-Json pour convertir les objets PowerShell en JSON, puis nous utilisons Set-Content ou Out-File pour écrire le JSON dans un fichier. Par exemple, pour exporter la liste des processus en cours d'exécution vers un fichier JSON nommé processus.json, nous utilisons la commande suivante :

Get-Process | ConvertTo-Json | Set-Content -Path processus.json

ou

Get-Process | ConvertTo-Json | Out-File -FilePath processus.json

Notez que ConvertTo-Json a une profondeur par défaut de 2, ce qui signifie qu'il ne convertira que les propriétés jusqu'à deux niveaux d'imbrication. Si vous avez des objets plus complexes, vous pouvez augmenter cette profondeur en utilisant l'option -Depth. Par exemple, pour une profondeur de 5 :

Get-Process | ConvertTo-Json -Depth 5 | Set-Content -Path processus.json

Importer des données depuis un fichier JSON

Pour lire des données à partir d'un fichier JSON et les convertir en objets PowerShell, nous utilisons la commande Get-Content pour lire le fichier, puis ConvertFrom-Json pour convertir le JSON en objets PowerShell. Par exemple, pour lire les données du fichier processus.json que nous avons créé précédemment, nous utilisons la commande suivante :

Get-Content -Path processus.json | ConvertFrom-Json

Cela lit le fichier JSON et crée des objets PowerShell avec des propriétés correspondant aux clés du fichier JSON. Nous pouvons ensuite manipuler ces objets comme nous le ferions avec n'importe quel autre objet PowerShell. Par exemple, pour afficher uniquement les noms des processus, nous pouvons utiliser la commande suivante :

Get-Content -Path processus.json | ConvertFrom-Json | Select-Object -Property ProcessName

Les fichiers HTML

HTML (HyperText Markup Language) est le langage standard utilisé pour créer des pages web. Il permet de structurer le contenu d'une page en utilisant des balises pour définir des éléments tels que des titres, des paragraphes, des listes, des tableaux, des images, des liens, etc. Un fichier HTML est essentiellement un fichier texte contenant du code HTML qui peut être interprété par un navigateur web pour afficher une page web. Un fichier HTML ressemble à ceci :

<!DOCTYPE html>
<html>
<head>
    <title>Ma page web</title>
</head>
<body>
    <h1>Bienvenue sur ma page web</h1>
    <p>Ceci est un paragraphe de texte.</p>
    <ul>
        <li>Élément de liste 1</li>
        <li>Élément de liste 2</li>
        <li>Élément de liste 3</li>
    </ul>
</body>
</html>

Exporter des données PowerShell vers un fichier HTML

Pour exporter des données vers un fichier HTML, nous utilisons la commande ConvertTo-Html pour convertir les objets PowerShell en HTML, puis nous utilisons Set-Content ou Out-File pour écrire le HTML dans un fichier. Par exemple, pour exporter la liste des processus en cours d'exécution vers un fichier HTML nommé processus.html, nous utilisons la commande suivante :

Get-Process | ConvertTo-Html | Set-Content -Path processus.html

ou

Get-Process | ConvertTo-Html | Out-File -FilePath processus.html

Notez que ConvertTo-Html crée une table HTML par défaut pour représenter les objets. Vous pouvez personnaliser le titre de la page et ajouter des styles CSS en utilisant les options -Title et -Head. Par exemple :

Get-Process | ConvertTo-Html -Title "Liste des processus" -Head "<style>table { border-collapse: collapse; } th, td { border: 1px solid black; padding: 5px; }</style>" | Set-Content -Path processus.html

Les objets personnalisés

Il est souvent utile de créer des objets personnalisés pour structurer les données avant de les exporter vers un fichier CSV ou JSON. Pour ce faire, nous utilisons la commande New-Object ou la syntaxe de hachage @{} pour créer des objets avec des propriétés spécifiques. Par exemple, pour créer un objet représentant un ordinateur avec des propriétés telles que le nom, l'adresse IP et le système d'exploitation, nous pouvons utiliser la commande suivante :

$computer = [pscustomobject]@{
    Name = "PC-01"
    IPAddress = "192.168.1.1"
    OperatingSystem = "Windows 10"
}

Nous pouvons ensuite créer une liste d'objets personnalisés en utilisant une boucle ou en ajoutant plusieurs objets à un tableau. Par exemple, pour créer une liste d'ordinateurs dans un inventaire, nous pouvons utiliser la commande suivante :

$inventory = @()
$inventory += [pscustomobject]@{
    Name = "PC-01"
    IPAddress = "192.168.1.1"
    OperatingSystem = "Windows 10"
}
$inventory += [pscustomobject]@{
    Name = "PC-02"
    IPAddress = "192.168.1.2"
    OperatingSystem = "Windows 10"
}
$inventory += [pscustomobject]@{
    Name = "PC-03"
    IPAddress = "192.168.1.3"
    OperatingSystem = "Windows 10"
}

Nous pouvons ensuite exporter cette liste d'objets personnalisés vers un fichier CSV ou JSON en utilisant les commandes Export-Csv ou ConvertTo-Json comme nous l'avons vu précédemment.