Jump to content
mr.tux

[POWERSHELL] Convertir une hashtable en html

Publications recommandées

Bonjour à tous, 

Je viens vous demandez un peu d'aide sur un script simple très simple en powershell :)

Voila mon problème, j'ai une hashtable ($hash) que je veux passer en HTML tout en enlevant les headers Name et Value.

Alors je fais ça

$hash = [ordered]@{
    'Prénom' = 'Bernard'
    'Nom de famille' = 'LHERMITE'
    'Nom complet' = 'Bernard LHERMITE'
    'Mail' = 'blhermite@domaine.com'
}

$hash |ft -HideTableHeaders 

Et ça fonctionne très bien, le problème c'est lorsque je rajoute ConvertTo-HTML

$hash |ft -HideTableHeaders | ConvertTo-HTML

Et la j'ai une sortie comme ça :

<tr><th>ClassId2e4f51ef21dd47e99d3c952918aff9cd</th><th>pageHeaderEntry</th><th>pageFooterEntry</th><th>autosizeInfo</th><th>shapeInfo</th><th>groupingEntry</th></tr>
<tr><td>033ecb2bc07a4d43b5ef94ed5a35d280</td><td></td><td></td><td></td><td>Microsoft.PowerShell.Commands.Internal.Format.TableHeaderInfo</td><td></td></tr>
<tr><td>9e210fe47d09416682b841769c78b8a3</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>4ec4f0187cb04f4cb6973460dfe252df</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>cf522b78d86c486691226b40aa69e95c</td><td></td><td></td><td></td><td></td><td></td></tr>
</table>

Comment je peux corrigé ça ?

Partager cette publication


Link to post
Share on other sites

En relisant le manuel ? 😛

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-html?view=powershell-6

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_hash_tables?view=powershell-6

ConvertTo-HTML ne comprend convenablement que des Psobject, or tu veux lui mettre une Hashtable donc il ne comprend pas. Il faut opérer une transformation.

https://blogs.msdn.microsoft.com/powershell/2009/12/04/new-object-psobject-property-hashtable/

La commande est :

New-Object psobject -Property $hash | ConvertTo-Html -Fragment

Le -Fragment c'est pour ne garder que le tableau Html et donc virer <head> et autres.

New-Object psobject -Property $hash | ConvertTo-Html -Fragment

<table>
<colgroup><col/><col/><col/><col/></colgroup>
<tr><th>Nom complet</th><th>Mail</th><th>Prénom</th><th>Nom de famille</th></tr>
<tr><td>Bernard LHERMITE</td><td>blhermite@domaine.com</td><td>Bernard</td><td>LHERMITE</td></tr>
</table>

 

Modifié par TheKillerOfComputer

Partager cette publication


Link to post
Share on other sites

Salut @TheKillerOfComputer

Merci pour ta réponse, je suis nouveau en programmation orientée objet je me suis mis au PS que récemment et ça aurait dû faire tilt avant :)

En fait je suis en train de faire un script qui gère les entrées sorties du personnel dans ma boite, et ce récapitulatif va être envoyé par mail au responsable, je le convertis en html car en texte brut la mise en forme n'est pas conservée (Outlook m'a tuer).

Prénom	Nom de famille	Nom complet	Mail
Bernard	LHERMITE	Bernard LHERMITE	blhermite@domaine.com

Alors que j'ai besoin de cette mise en forme :

Prénom                         Bernard                                                                                                                         
Nom de famille                 LHERMITE                                                                                                                       
Nom complet                    Bernard LHERMITE                                                                                                               
Mail                           blhermite@domaine.com    

Il existe une fonction qui pourrait gérer ça ?

Partager cette publication


Link to post
Share on other sites
$table=New-Object PSObject -property @{"Prénom" ="Bernard";"Nom de famille"="Hot";"Nom complet"="Bernard LHERMITE"; "Mail"="blhermite@domaine.com";}
$table |  ConvertTo-Html -Fragment -As List

Résultat

<table>
<tr><td>Nom complet:</td><td>Bernard LHERMITE</td></tr>
<tr><td>Mail:</td><td>blhermite@domaine.com</td></tr>
<tr><td>Prénom:</td><td>Bernard</td></tr>
<tr><td>Nom de famille:</td><td>Hot</td></tr>
</table>

Sinon sans le HTML tu as le format-list

$table=New-Object PSObject -property @{"Prénom" ="Bernard";"Nom de famille"="Hot";"Nom complet"="Bernard LHERMITE"; "Mail"="blhermite@domaine.com";}
$table | Format-List

Nom complet    : Bernard LHERMITE
Mail           : blhermite@domaine.com
Prénom         : Bernard
Nom de famille : Hot

Have fun

(et si tu veux aller plus loins dans le formatage transposé (ce que tu cherche à faire s'apelle du "transpose")

$table=New-Object PSObject -property @{"Prénom" ="Bernard";"Nom de famille"="Hot";"Nom complet"="Bernard LHERMITE"; "Mail"="blhermite@domaine.com";}
$table | Get-Member | Where-Object {$_.MemberType -eq "NoteProperty"} |
 Select-Object -Property Name |
     ForEach-Object {
        $r = [ordered]@{}
        $r.Clef = $_.Name
        $r.Valeur = $table.($_.Name)
        New-Object -TypeName psobject -Property $r
    } | ConvertTo-Html -Fragment

 

Partager cette publication


Link to post
Share on other sites

Merci @Sheetux, 

Très intéressent pour les différentes méthodes, je vais approfondir ça cet été.

Par contre je dois vraiment être à coté de la plaque car quand j'essaie de l'intégrer avec un texte (String) ça me donne ça : "Détails du compte :System.Object[]"

 

$table=New-Object PSObject -property @{"Prénom" ="Bernard";"Nom de famille"="Hot";"Nom complet"="Bernard LHERMITE"; "Mail"="blhermite@domaine.com";}
$table2 = $table |  ConvertTo-Html -Fragment -As List

$intro = "Détails du compte :"

$monTexte = -join ($intro, $table2)

Pourtant quand je fais un  "gm " sur $intro et $table2 ça me donne bien  des variables de type "System.String", je ne comprends pas pourquoi ça ne fonctionne pas.

Partager cette publication


Link to post
Share on other sites

Regarde les options de convert-to-html, il y a assez de quoi s'amuser :rtfm: :mike:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-html?view=powershell-6

$table=New-Object PSObject -property @{"Prénom" ="Bernard";"Nom de famille"="LHERMITE";"Nom complet"="Bernard LHERMITE"; "Mail"="blhermite@domaine.com";}
$table |  ConvertTo-Html  -Fragment -As List -PreContent "Détails du compte :"

Pour le problème de jointure, il me semble que convert-to-html renvoi une table pas une chaine .

Partager cette publication


Link to post
Share on other sites

|object].GetType() est là pour savoir :

Citer

Write-Output $table2.GetType()

Write-Output $monTexte.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                      
-------- -------- ----                                     --------                                                                                                      
True     True     Object[]                                 System.Array                                                                                                  
True     True     String                                   System.Object  

$table2 est bien un array, de strings pour être exact.

Tu as plusieurs tactiques. Utiliser comme dit au dessus les possibilités de ConvertTo-HTML pour prepend ou append du texte durant la conversion, probablement moins gourmand en puissance.

Sinon, tu peux faire les maniements habituels des arrays. Par exemple (les <p> parce qu'on est en HTML, autant rester propre) : $table2 = "<p>Texte de début</p>`n" + $table2 + "`n<p>Texte de fin</p>"

Ou encore, tu dois d'abord join $table2 en lui-même pour qu'il se transforme en String, avant de joindre le String $intro avec. $table2bis = -join $table2 ; $monTexte = -join ($intro, $table2bis) et là ça marchera.

Après vu que j'imagine que c'est pour sortir dans un fichier, on aurait pû jouer dès la hashtable du début en mode bourrin :

Citer

"<table>`r`t<th>Clé</th><th>Valeur</th>" > D:\Resultat.txt

$hash.GetEnumerator() | ForEach-Object{
        "`t`t<tr><td>{0}</td><td>{1}</td></tr>" -f $_.key, $_.value >> D:\Resultat.txt
}

"</table>" >> D:\Resultat.txt

Oui c'est un peu crade 😄 mais ça a le mérite d'être simple. L'avantage ici serait que tu peux utiliser des divs ou autres à la place, et plus facilement l'intégrer à un tableau déjà existant sans que ça casse d'une façon ou d'une autre. Ici j'ai choisi d'exporter vers un fichier, d'où le >  D:\Resultat.txt ou >> D:\Resultat.txt.

Modifié par TheKillerOfComputer

Partager cette publication


Link to post
Share on other sites

Salut à tous,

Merci Sheeptux, j'ai utilisé -PreContent $Mail.Header -InputObject $account -PostContent $Mail.Footer   :)

|object].GetType() je connaissait mais je ne l'utilisait pas assez souvent :sm:

# Envoie un message au chef d'équipe pour l'avertir de la création d'un nouveau compte.



$Mail=New-Object PSObject -property @{
                                        "From"    ="sysadmin@bosse.dur";
                                        "To"      ="test@tuxdom.local";
                                        "Subject" ="SI : Une nouvelle recrue arrive dans votre équipe."; 
                                        "Body"    ="";
                                        "Header"  ="<H1>Ci après les détails du compte </H1>";
                                        "Footer"  ="<br />Cordialement.";
                                        "Server"  = "127.0.0.1";
                                      }


$account=New-Object PSObject -property @{
                                        "Prénom" ="Bernard";
                                        "Nom de famille"="LHERMITE";
                                        "Nom complet"="Bernard LHERMITE"; 
                                        "Mail"="blhermite@tuxland.tld";
                                      }

$accountHtml= ConvertTo-Html -Fragment -As List -PreContent $Mail.Header -InputObject $account -PostContent $Mail.Footer           

Microsoft.PowerShell.Utility\Send-MailMessage -From $Mail.From -To $Mail.To -Subject $Mail.Subject -Body ($accountHtml  | Out-String) -SmtpServer 127.0.0.1 -BodyAsHtml -Encoding 'UTF8'

J'ai intégré ça dans une fonction de mon script de création de compte, pour que la personne responsable reçoivent les info directement par mail. 

Très bonnes explications @TheKillerOfComputer, comme dit plus haut, je débute en poo j'ai fait pas mal de PHP 3 pour le fun (du procédural a l'ancienne), du coup de découvre pas mal les aspects de ce fantastique langage (pour les admins Windows)  qu'est le PS1.

En tout cas merci pour votre aide, ça c'est de l'INpactitude !

Modifié par mr.tux

Partager cette publication


Link to post
Share on other sites

Veuillez vous connecter pour commenter

Vous serez en mesure de laisser un commentaire après vous être connecté



Se connecter dès maintenant

×