Actualités

Lire un fichier Windows INI dans PowerShell

Récemment, j’ai trouvé qu’il pouvait être vraiment utile de lire le contenu d’un fichier INI dans PowerShell. Non seulement Windows et certaines applications stockent certaines de leurs données de configuration dans des fichiers INI, mais vous pouvez également utiliser cette technique pour créer des scripts PowerShell qui se comportent différemment en fonction des données de configuration stockées dans un fichier INI externe. Par exemple, un fichier INI peut enregistrer la localisation à utiliser par un script ou par le jeu de couleurs du script ou tout ce que vous pouvez imaginer.

La lecture d’un fichier INI dans PowerShell est simple. Vous pouvez le faire avec une seule ligne de code. Voici un exemple:

$INI = Get-Content C:ScriptsExample.ini

Dans ce cas, j’écris le contenu du fichier INI dans une variable appelée $ INI. Si j’extrait le contenu de la variable, vous pouvez voir ce que contient le fichier INI, comme indiqué dans la figure ci-dessous.

Lire un fichier INI dans PowerShell

Placer les valeurs de fichier INI dans le hachage PowerShell

Bien sûr, il y a une grande différence entre lire le contenu d’un fichier INI dans une variable et placer le contenu du fichier INI dans un format utilisable. Pour cet article, je vais vous montrer comment placer chacune des valeurs du fichier INI dans une table de hachage. Si vous n’êtes pas familier avec les tables de hachage, assurez-vous de consulter mon récent article sur le sujet.

Malheureusement, il n’existe pas de fonction automatique pour convertir le contenu d’un fichier INI en hachage PowerShell. Comme vous pouvez l’imaginer, le processus a tendance à être un peu compliqué. Même ainsi, je vais le rendre aussi indolore que possible.

En plus de la table de hachage que nous créons, nous devons utiliser deux tables qui contiendront temporairement les données jusqu’à ce que nous les placions dans la table de hachage. Je définirai l’une de ces tables ($ IniTemp) au début du script, ainsi que la table de hachage ($ IniHash). Je créerai dynamiquement l’autre table ($ SplitArray) plus tard dans le script.

Comme mentionné précédemment, la première étape de la création d’une table de hachage basée sur le contenu d’un fichier INI consiste à lire le fichier dans PowerShell. Puisque le but ultime est de créer une table de hachage, cependant, nous devons faire un peu plus de travail que de simplement l’utiliser. Télécharger le contenu de l’applet de commande.

Si vous regardez la capture d’écran précédente, vous remarquerez qu’un fichier INI se compose généralement de plus que de simples paires clé / valeur. Il existe également des en-têtes de section (entre crochets) et des lignes vides. Avant même de penser à ajouter des données d’un fichier INI à une table de hachage, nous devons filtrer les lignes vides et les en-têtes de section. Voici la première ligne ($ IniTemp).

PowerShell permet de lire un fichier texte (dans ce cas, un fichier INI) de chaque ligne. Après avoir lu une ligne, nous pouvons effectuer quelques tests simples pour voir si la ligne est vide ou si elle commence par un bras (ce qui indiquerait qu’il s’agit d’une ligne d’en-tête). Si la ligne est vide ou si elle commence par un crochet, nous ignorerons simplement la ligne. Cependant, si la ligne n’est pas vide et ne commence pas par un crochet, nous l’ajouterons au tableau. Le résultat devrait être que la table $ IniTemp contient uniquement les données placées dans la table de hachage. Ne doit pas contenir de lignes d’en-tête ni de lignes vides. Voici le code que j’utilise:

Write-Host ('Ceci est le contenu brut du fichier INI:') Write-Host $ INI = Get-Content C:  Scripts  Example.ini $ Ini $ IniHash = @ {} $ IniTemp = @ () ForEach ( $ Line in $ INI) {If ($ Line -ne "" -et $ Line.StartsWith ("[") -ne $True)
{
$IniTemp += $Line
}
}
Write-Host
Write-Host('=============================================')
Write-Host
Write-Host ('This is what has been added to $IniTemp after filtering')
Write-Host
$IniTemp

This block of code is actually longer than it needs to be. I added several Write-Host statements that help to illustrate what is going on as the code runs. As previously noted, the script starts by reading the INI file, creating an empty hash table, and creating an empty array. The filtering process is accomplished with the ForEach loop. This loop goes through the script one line at a time and checks to see if the line is a blank row or a header row. If the line contains actual data, meaning that it isn’t blank and is not a header row, it is added to the $IniTemp array. You can see the actual code and its output in the next figure.

Reading an INI file into PowerShell

Converting the array data into a hash table

Now that we have filtered the data and placed it into an array, the last step is to convert the array data into a hash table. This is where things get a little bit tricky. A hash table consists of key/value pairs, but right now, our array only contains text strings. The key to converting the array contents into a hash table is to split each line at the equal sign. This is where the dynamically created array that I mentioned earlier will come into play. Everything to the left of the equal sign will go into position 0 of this dynamically created array (which is called $SplitArray). Everything to the right of the equal sign goes into array position 1. Once that happens, we can add the $SplitArray contents to the hash table, with array position 0 acting as the key and array position 1 acting as the value. Here is the code:

ForEach($Line in $IniTemp)
{
$SplitArray = $Line.Split("=")
$IniHash += @{$SplitArray[0] = $ SplitArray[1]}

Comme vous pouvez le voir, j’ai créé une autre boucle ForEach. Cela traite chaque ligne de la table $ IniTemp une par une. La ligne de code suivante divise la chaîne de texte à l’intérieur de la table en le même symbole et la ligne ci-dessous ajoute les valeurs de fractionnement à la table de hachage. Voici le script complet:

Write-Host ('This is the raw INI file contents: ')
Write-Host
$INI = Get-Content C:ScriptsExample.ini
$Ini

$IniHash = @{}
$IniTemp = @()
ForEach($Line in $INI)
{
If ($Line -ne "" -and $Line.StartsWith("[") -ne $True)
{
$IniTemp += $Line
}
}
Write-Host
Write-Host('=============================================')
Write-Host
Write-Host ('This is what has been added to $IniTemp after filtering')
Write-Host
$IniTemp

Write-Host
Write-Host('===============================================')
Write-Host
Write-Host('Here is the hash table:')
Write-Host

ForEach($Line in $IniTemp)
{
$SplitArray = $Line.Split("=")
$IniHash += @{$SplitArray[0] = $SplitArray[1]}
}
$IniHash

Vous pouvez voir le script réel et sa sortie dans la figure suivante.

Évitez les manipulations de cordes compliquées

Ainsi, vous pouvez lire le contenu d’un fichier INI dans une table de hachage. Il existe des moyens plus complets de le faire, mais j’ai utilisé cette approche particulière car elle évite la plupart des manipulations de cordes les plus complexes.

Image en vedette: Shutterstock / TechGenix Image

Affichage des messages:
2

Suite Principes de base de PowerShell des articles
Lire un fichier INI dans PowerShell

Récemment, j’ai trouvé qu’il pouvait être vraiment utile de lire le contenu d’un fichier INI dans PowerShell. Non seulement Windows et certaines applications stockent certaines de leurs données de configuration dans des fichiers INI, mais vous pouvez également utiliser cette technique pour créer des scripts PowerShell qui se comportent différemment en fonction des données de configuration stockées dans un fichier INI externe. Par exemple, un fichier INI peut enregistrer la localisation à utiliser par un script ou par le jeu de couleurs du script ou tout ce que vous pouvez imaginer.

La lecture d’un fichier INI dans PowerShell est simple. Vous pouvez le faire avec une seule ligne de code. Voici un exemple:

$INI = Get-Content C:ScriptsExample.ini

Dans ce cas, j’écris le contenu du fichier INI dans une variable appelée $ INI. Si j’extrait le contenu de la variable, vous pouvez voir ce que contient le fichier INI, comme indiqué dans la figure ci-dessous.

Lire un fichier INI dans PowerShell

Placer les valeurs de fichier INI dans le hachage PowerShell

Bien sûr, il y a une grande différence entre lire le contenu d’un fichier INI dans une variable et placer le contenu du fichier INI dans un format utilisable. Pour cet article, je vais vous montrer comment placer chacune des valeurs du fichier INI dans une table de hachage. Si vous n’êtes pas familier avec les tables de hachage, assurez-vous de consulter mon récent article sur le sujet.

Malheureusement, il n’existe pas de fonction automatique pour convertir le contenu d’un fichier INI en hachage PowerShell. Comme vous pouvez l’imaginer, le processus a tendance à être un peu compliqué. Même ainsi, je vais le rendre aussi indolore que possible.

En plus de la table de hachage que nous créons, nous devons utiliser deux tables qui contiendront temporairement les données jusqu’à ce que nous les placions dans la table de hachage. Je définirai l’une de ces tables ($ IniTemp) au début du script, ainsi que la table de hachage ($ IniHash). Je créerai dynamiquement l’autre table ($ SplitArray) plus tard dans le script.

Comme mentionné précédemment, la première étape de la création d’une table de hachage basée sur le contenu d’un fichier INI consiste à lire le fichier dans PowerShell. Puisque le but ultime est de créer une table de hachage, cependant, nous devons faire un peu plus de travail que de simplement l’utiliser. Télécharger le contenu de l’applet de commande.

Si vous regardez la capture d’écran précédente, vous remarquerez qu’un fichier INI se compose généralement de plus que de simples paires clé / valeur. Il existe également des en-têtes de section (entre crochets) et des lignes vides. Avant même de penser à ajouter des données d’un fichier INI à une table de hachage, nous devons filtrer les lignes vides et les en-têtes de section. Voici la première ligne ($ IniTemp).

PowerShell permet de lire un fichier texte (dans ce cas, un fichier INI) de chaque ligne. Après avoir lu une ligne, nous pouvons effectuer quelques tests simples pour voir si la ligne est vide ou si elle commence par un bras (ce qui indiquerait qu’il s’agit d’une ligne d’en-tête). Si la ligne est vide ou si elle commence par un crochet, nous ignorerons simplement la ligne. Cependant, si la ligne n’est pas vide et ne commence pas par un crochet, nous l’ajouterons au tableau. Le résultat devrait être que la table $ IniTemp contient uniquement les données placées dans la table de hachage. Ne doit pas contenir de lignes d’en-tête ni de lignes vides. Voici le code que j’utilise:

Write-Host ('Ceci est le contenu brut du fichier INI:') Write-Host $ INI = Get-Content C:  Scripts  Example.ini $ Ini $ IniHash = @ {} $ IniTemp = @ () ForEach ( $ Line in $ INI) {If ($ Line -ne "" -et $ Line.StartsWith ("[") -ne $True)
{
$IniTemp += $Line
}
}
Write-Host
Write-Host('=============================================')
Write-Host
Write-Host ('This is what has been added to $IniTemp after filtering')
Write-Host
$IniTemp

This block of code is actually longer than it needs to be. I added several Write-Host statements that help to illustrate what is going on as the code runs. As previously noted, the script starts by reading the INI file, creating an empty hash table, and creating an empty array. The filtering process is accomplished with the ForEach loop. This loop goes through the script one line at a time and checks to see if the line is a blank row or a header row. If the line contains actual data, meaning that it isn’t blank and is not a header row, it is added to the $IniTemp array. You can see the actual code and its output in the next figure.

Reading an INI file into PowerShell

Converting the array data into a hash table

Now that we have filtered the data and placed it into an array, the last step is to convert the array data into a hash table. This is where things get a little bit tricky. A hash table consists of key/value pairs, but right now, our array only contains text strings. The key to converting the array contents into a hash table is to split each line at the equal sign. This is where the dynamically created array that I mentioned earlier will come into play. Everything to the left of the equal sign will go into position 0 of this dynamically created array (which is called $SplitArray). Everything to the right of the equal sign goes into array position 1. Once that happens, we can add the $SplitArray contents to the hash table, with array position 0 acting as the key and array position 1 acting as the value. Here is the code:

ForEach($Line in $IniTemp)
{
$SplitArray = $Line.Split("=")
$IniHash += @{$SplitArray[0] = $ SplitArray[1]}

Comme vous pouvez le voir, j’ai créé une autre boucle ForEach. Cela traite chaque ligne de la table $ IniTemp une par une. La ligne de code suivante divise la chaîne de texte à l’intérieur de la table en le même symbole et la ligne ci-dessous ajoute les valeurs de fractionnement à la table de hachage. Voici le script complet:

Write-Host ('This is the raw INI file contents: ')
Write-Host
$INI = Get-Content C:ScriptsExample.ini
$Ini

$IniHash = @{}
$IniTemp = @()
ForEach($Line in $INI)
{
If ($Line -ne "" -and $Line.StartsWith("[") -ne $True)
{
$IniTemp += $Line
}
}
Write-Host
Write-Host('=============================================')
Write-Host
Write-Host ('This is what has been added to $IniTemp after filtering')
Write-Host
$IniTemp

Write-Host
Write-Host('===============================================')
Write-Host
Write-Host('Here is the hash table:')
Write-Host

ForEach($Line in $IniTemp)
{
$SplitArray = $Line.Split("=")
$IniHash += @{$SplitArray[0] = $SplitArray[1]}
}
$IniHash

Vous pouvez voir le script réel et sa sortie dans la figure suivante.

Évitez les manipulations de cordes compliquées

Ainsi, vous pouvez lire le contenu d’un fichier INI dans une table de hachage. Il existe des moyens plus complets de le faire, mais j’ai utilisé cette approche particulière car elle évite la plupart des manipulations de cordes les plus complexes.

Image en vedette: Shutterstock / TechGenix Image

Affichage des messages:
2

Suite Principes de base de PowerShell des articles



Post Views:
177

Vous pourriez également aimer...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.