tuto powershell creer des rapports HTML
  • 24 février 2025
  • ComputaSYS
  • 0


I. Présentation

PowerShell est tout à fait capable de manipuler des données dans différents formats et langages, et l’HTML fait partie de ceux pris en charge. Dans ce tutoriel, nous allons voir comment vous pouvez en tirer profit pour créer des rapports au format HTML.

L’avantage de l’utilisation du HTML pour les rapports est qu’il permet de structurer et de présenter les informations de manière lisible et interactive. Nous allons explorer deux méthodes principales pour générer des rapports HTML : l’utilisation du cmdlet ConvertTo-Html et l’utilisation du module PSWriteHTML, qui offre plus de flexibilité et de personnalisation.

II. Utilisation du cmdlet ConvertTo-Html

Le cmdlet ConvertTo-Html est une solution native de PowerShell permettant de transformer des objets en code HTML. Il est simple d’utilisation aux premiers abords, mais si on veut aller plus loin, il est nécessaire de connaître la syntaxe du langage HTML et du CSS (pour la mise en forme).

A. Exporter le résultat d’une commande au format HTML

Dans cet exemple, le cmdlet ConvertTo-Html est utilisé pour exporter la liste des processus en cours d’exécution dans un tableau HTML. Le résultat est enregistré dans un fichier nommé “Rapport.html”.

Get-Process | ConvertTo-Html | Out-File “C:\Scripts\HTML\Rapport.html”

En exécutant cette commande, vous obtenez le résultat ci-dessous, à savoir un tableau HTML brut, sans aucun effort sur la mise en forme. Autrement dit, il n’y a aucun code CSS permettant d’ajouter un peu de couleurs ou autre.

Voici le résultat obtenu :

Remarque : le CSS (Cascading Style Sheets) est un langage de style utilisé pour définir l’apparence et la mise en page des éléments HTML d’une page web.

B. Ajouter un titre à la page

Il est possible d’ajouter un titre à la page HTML grâce au paramètre -Title. Ce titre sera visible dans le navigateur, au niveau de l’onglet correspondant au fichier HTML.

Get-Process | ConvertTo-Html -Title “Liste des processus” | Out-File “C:\Scripts\HTML\Rapport2.html”

Concrètement, ce paramètre va adapter le code HTML pour ajouter ce bout de code :

Liste des processus

C. Ajouter du style CSS

Désormais, en place du titre, nous allons ajouter du code CSS pour améliorer l’affichage de notre tableau au format HTML. Cela va améliorer sa lisibilité et l’aperçu global de notre tableau. Le paramètre -PreContent permet d’insérer des éléments avant le tableau, ici l’équivalent d’une feuille de style CSS intégrée au code HTML. Vous devez disposer de quelques bases en CSS et HTML pour parvenir à améliorer la mise en forme du tableau, mais ce n’est pas très compliqué.

$Style = “”

Get-Process | ConvertTo-Html -Title “Liste des processus” -PreContent $Style | Out-File “C:\Scripts\HTML\Rapport3.html”

Cette fois-ci, le tableau est plus facile à interpréter. Voici le résultat obtenu :

Voici quelques explications pour vous aider à interpréter le code CSS :

body { font-family: Arial; } : définit la police de caractère globale du document en Arial

table { width: 100%; border-collapse: collapse; } : rend le tableau en largeur 100% et fusionne les bordures pour éviter les doubles lignes.

th, td { border: 1px solid black; padding: 5px; } : ajoute une bordure noire de 1 pixel (épaisseur) et un espacement interne (padding) de 5px aux cellules ⁣th (en-tête) et td (colonne)

th { background-color : #C0C0C0; } : applique un fond gris clair (#C0C0C0) aux cellules d’en-tête (th).

Remarque : vous pouvez également utiliser le paramètre “-PostContent” pour ajouter du contenu à la suite du tableau, dans le fichier de sortie HTML. Cela peut être utile pour ajouter une mention, un logo, etc.

III. Construire un fichier HTML sur-mesure

Pour aller plus loin et rendre ce tableau plus facilement lisible, nous pouvons lui ajouter un peu de couleurs. Par exemple, pour mettre en évidence certaines lignes selon un critère spécifique. Dans ce cas, l’idée sera la suivante : ajouter un code CSS spécifique (code statique ou appel d’une classe CSS) dans le but de modifier l’apparence des lignes concernées.

Il est possible d’utiliser le cmdlet ConvertTo-Html, en venant ensuite modifier le code HTML généré pour injecter le code CSS aux bons endroits. Vous pouvez consulter ce script pour avoir un exemple (ligne 269 à 289). Une autre façon de faire consiste à construire nous-mêmes le code HTML, puisque la structure de ce langage est assez simple. C’est ce que nous allons voir.

L’objectif sera le suivant : exporter la liste des services de la machine locale et ajouter du rouge comme couleur de fond sur toutes les lignes où le service est actuellement arrêté.

Nous allons commencer par déclarer notre code CSS, en le mettant en forme de façon à ce qu’il soit plus facile à lire et à modifier (contrairement à l’exemple précédent). Vous remarquerez la classe CSS .stopped qui s’appliquera aux lignes où le service est arrêté.

# Définir le style CSS
# La classe .stopped sera affectée à toutes les lignes où le service est arrêté
$Style = @”

“@

Puis, nous récupérons la liste des services en sélectionnant trois propriétés (c’est important puisque nous devrons le code HTML par la suite), à savoir Name, DisplayName et Status. Grâce à une boucle ForEach, nous construisons un tableau au format HTML (sans la ligne d’en-tête).

# Récupérer la liste des services et injecter la classe CSS quand c’est nécessaire
$HTMLTable = Get-Service | Select-Object Name, DisplayName, Status | ForEach-Object {
$class = if ($_.Status -eq “Stopped”) { “class=’stopped'” } else { “” }
“$($_.Name)$($_.DisplayName)$($_.Status)”
}

Enfin, nous devons assembler le code de notre tableau avec une structure HTML traditionnelle. La ligne “NomNom completStatut” a pour objectif de déclarer la ligne d’en-tête de notre tableau, en respectant la liste des propriétés sélectionnées précédemment (via Get-Service).

# Construire le fichier final au format HTML
$HTML = @”

$Style

Liste des services

NomNom completStatut
$($HTMLTable -join “`n”)

“@

# Exporter dans un fichier
$HTML | Out-File “C:\Scripts\HTML\Rapport-4.html”

Voici le script PowerShell complet :

# Définir le style CSS
# La classe .stopped sera affectée à toutes les lignes où le service est arrêté
$Style = @”

“@

# Récupérer la liste des services et injecter la classe CSS quand c’est nécessaire
$HTMLTable = Get-Service | Select-Object Name, DisplayName, Status | ForEach-Object {
$class = if ($_.Status -eq “Stopped”) { “class=’stopped'” } else { “” }
“$($_.Name)$($_.DisplayName)$($_.Status)”
}

# Construire le fichier final au format HTML
$HTML = @”

$Style

Liste des services

NomNom completStatut
$($HTMLTable -join “`n”)

“@

# Exporter dans un fichier
$HTML | Out-File “C:\Scripts\HTML\Rapport-4.html”

Qu’en est-il du résultat final ? Regardez par vous-même le fichier HTML obtenu suite à l’exécution du script.

Dans la suite de cet article, nous allons évoquer l’utilisation du module PSWriteHTML.

Note : il est possible de construire de beaux rapports en HTML en générant le code soi-même et en adaptant le CSS. Néanmoins, cela demande plus de temps, en comparaison de la méthode que nous allons évoquer dans la suite de cet article.

IV. Prise en main de PSWriteHTML

PSWriteHTML est un module PowerShell destiné à ceux qui veulent créer de beaux rapports HTML sans connaitre le HTML et le CSS. Il permet aussi d’aller plus loin dans la personnalisation des rapports HTML en intégrant des tableaux interactifs, des graphiques et d’autres éléments visuels.

Il a été créé par EvotecIT, comme d’autres excellents modules, dont CleanupMonster et GPOZaurr. D’ailleurs, ces deux modules s’appuient sur PSWriteHTML pour la création des rapports HTML.

A. Installation de PSWriteHTML

Pour installer le module PSWriteHTML, il suffit d’exécuter la commande suivante dans une console PowerShell :

Install-Module -Name PSWriteHTML

B. Les principales commandes de PSWriteHTML

Vous pouvez lister toutes les commandes du module de cette façon :

Get-Command -Module PSWriteHTML

À l’heure actuelle, il y a 196 cmdlets PowerShell dans ce module, donc autant vous dire qu’il y a de quoi faire !

Quelques commandes essentielles de ce module :

New-HTML : crée un document HTML.

New-HTMLTable : ajoute un tableau au rapport.

New-HTMLHeader : ajoute un en-tête au rapport (utile pour indiquer un nom de rapport, un nom d’entreprise, ajouter un logo, etc.)

New-HTMLChart : ajoute un graphique.

New-HTMLSection : permet de structurer le rapport en sections (découper une page en section)

New-ChartDonut : ajouter un diagramme circulaire (ou diagramme en camembert, pour les Normands)

C. Créer son premier rapport avec PSWriteHTML

Voici un exemple simple de rapport interactif avec PSWriteHTML :

New-HTML -Title “Rapport PowerShell” -FilePath “C:\Scripts\HTML\Rapport.html” {
New-HTMLSection -HeaderText “Liste des processus” {
New-HTMLTable -DataTable (Get-Process)
}
}

Ce script génère un rapport HTML contenant un tableau interactif affichant la liste des processus en cours d’exécution. Il est plus lourd à l’exécution qu’un simple ConvertTo-Html, mais le résultat n’est pas comparable. Voici le rapport HTML obtenu :

Il donne accès à des fonctions supplémentaires :

Trier selon le nom d’une colonne, d’un simple clic

Exporter les résultats (PDF, CSV, Excel)

Cliquer sur un processus pour avoir des précisions supplémentaires à son sujet

Effectuer une recherche grâce à la barre de recherche

Nous allons voir comment aller plus loin…

D. Créer un rapport HTML avec des graphiques

Le module PSWriteHtml intègre de nombreux cmdlets PowerShell pour personnaliser le rapport HTML, notamment pour intégrer un menu, et donc naviguer entre plusieurs pages. Il est également possible de créer des tableaux et des graphes en tout genre. Vous pouvez créer des sections dans le rapport et chaque section peut contenir un ou plusieurs éléments.

Ci-dessous, un exemple de rapport avec des informations sur les machines intégrées au domaine Active Directory. Il contient les éléments suivants :

Un en-tête avec le nom de domaine Active Directory et la date du jour

Une première section avec deux graphes

La répartition par OS des machines intégrées au domaine AD

La répartition par type d’OS Desktop / Server des machines intégrées au domaine AD

Une deuxième section avec deux tableaux

La liste des postes de travail intégrés au domaine

La liste des serveurs intégrés au domaine

Maintenant, nous allons regarder d’un peu plus près le code PowerShell permettant d’atteindre cet objectif.

Voici la première partie du script pour récupérer les données sur les machines intégrées au domaine. Il s’agit d’un code simple basé sur l’utilisation de Get-ADComputer du module Active Directory. L’idée étant de stocker dans des variables les informations à afficher ensuite sous forme de graphes ou de tableaux.

# Récupération des données

# Mettre en mémoire la liste des ordinateurs présents dans AD
$ComputersList = Get-ADComputer -Filter * -Properties Name, OperatingSystem, whenCreated, IPv4Address

# Compter les occurrences de chaque OS
$ComputersOSName = $ComputersList | Group-Object -Property OperatingSystem | Sort-Object Count -Descending

# Classification des OS avec une propriété calculée
$ComputersOSType = $ComputersList | Select-Object OperatingSystem, @{
Name=”TypeOS”;
Expression={
if ($_.OperatingSystem -match “Windows Server”) { “Windows Server” }
else { “Windows Desktop” }
}
} | Group-Object -Property TypeOS | Sort-Object Count -Descending

# Propriétés à exporter pour les tableaux de machines
$ComputersOSProperties = @(“Name”, “OperatingSystem”, “IPv4Address”, “whenCreated”)
# Récupérer la liste des postes de travail
$ComputersOSDesktop = $ComputersList | Select-Object $ComputersOSProperties | Sort-Object Name | Where-Object { $_.OperatingSystem -NotMatch “Server” }

# Récupérer la liste des serveurs
$ComputersOSServer = $ComputersList | Select-Object $ComputersOSProperties | Sort-Object Name | Where-Object { $_.OperatingSystem -Match “Windows Server” }

Dans le code ci-dessus, l’utilisation de Group-Object -Property TypeOS est intéressante, car cela permet de regrouper les machines de l’AD par type d’OS, avec le nombre d’éléments. Pratique pour ensuite en faire un graphe !

Venons-en désormais au code basé sur PSWriteHtml pour construire le rapport HTML.

# Construction du rapport HTML avec PSWriteHTML
New-HTML -Title “Répartition des OS” -FilePath “C:\Scripts\HTML\RapportOS-2.html” -ShowHTML:$true {

# En-tête du rapport avec le nom du domaine et la date
New-HTMLHeader {
New-HTMLSection -Invisible {
New-HTMLPanel -Invisible {
New-HTMLText -Text “Domaine : $($env:USERDNSDOMAIN)” -FontSize 18 -FontWeight 100
New-HTMLText -Text “Date : $(Get-Date -Format “dd/MM/yyyy”)” -FontSize 12
} -AlignContentText left
}
}

# Section 1 – Graphes
New-HTMLSection -HeaderText “Distribution des OS dans Active Directory” -HeaderBackGroundColor “#00698e” {
New-HTMLChart -Title “Répartition par OS” -Gradient {
foreach ($Line in $ComputersOSName) {
New-ChartDonut -Name $Line.Name -Value $Line.Count
}
}
New-HTMLChart -Title “Répartition Desktop / Server” -Gradient {
foreach ($Line in $ComputersOSType) {
New-ChartDonut -Name $Line.Name -Value $Line.Count
}
}
}

# Section 2 – Tableaux avec la liste des ordinateurs
New-HTMLSection -HeaderText “Liste des machines inscrites dans l’Active Directory” -HeaderBackGroundColor “#00698e” {
New-HTMLPanel {
New-HTMLTable -DataTable $ComputersOSDesktop -HideFooter -AutoSize
}
New-HTMLPanel {
New-HTMLTable -Title “Liste des postes des serveurs” -DataTable $ComputersOSServer -HideFooter -AutoSize
}
}
}

L’idée est la suivante :

Vous devez déclarer un nouveau rapport HTML avec le cmdlet New-HTML

L’option -ShowHTML:$true du cmdlet New-HTML sert à ouvrir le rapport automatiquement une fois qu’il est généré.

Vous devez déclarer l’en-tête avec le cmdlet New-HTMLHeader

Chaque nouvelle section (bloc avec plusieurs éléments à l’intérieur) est déclarée via le cmdlet New-HTMLSection

Ensuite, vous devez imbriquer les éléments les uns avec les autres, de façon hiérarchique (ce qui permet de visualiser mentalement la mise en page du rapport). C’est pour cette raison que sous la déclaration du rapport HTML, il y a la déclaration d’une section, et sous la section, il y a la déclaration des deux graphes.

Chaque cmdlet dispose de ses propres options, pour ajuster la mise en forme, ajouter un titre, modifier le CSS, etc… C’est très flexible et personnalisable. Cet exemple montre le potentiel de ce module PowerShell et la facilité avec laquelle il est possible de récupérer des données et de les mettre en forme dans un rapport.

Retrouvez le script complet sur le GitHub IT-Connect :

V. Conclusion

Comme nous venons de le voir, PowerShell offre plusieurs possibilités pour générer des rapports HTML, allant du simple ConvertTo-Html aux rapports plus avancés avec PSWriteHTML. Je vous recommande vivement d’utiliser PSWriteHTML si vous souhaitez obtenir des rapports plus interactifs et esthétiques, qui sont aussi un peu plus lourds à générer. Ils créent aussi une dépendance au module PSWriteHTML, contrairement à l’utilisation du cmdlet PowerShell natif.

Qu’en pensez-vous ?

Si vous souhaitez apprendre le langage PowerShell, retrouvez mon cours en ligne et mon livre sur le sujet :

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.



Source link

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *