mr.tux Posted August 3, 2018 Share Posted August 3, 2018 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 ? Link to comment Share on other sites More sharing options...
TheKillerOfComputer Posted August 3, 2018 Share Posted August 3, 2018 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> Link to comment Share on other sites More sharing options...
mr.tux Posted August 4, 2018 Author Share Posted August 4, 2018 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 ? Link to comment Share on other sites More sharing options...
Sheepux Posted August 4, 2018 Share Posted August 4, 2018 $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 Link to comment Share on other sites More sharing options...
mr.tux Posted August 4, 2018 Author Share Posted August 4, 2018 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. Link to comment Share on other sites More sharing options...
Sheepux Posted August 5, 2018 Share Posted August 5, 2018 Regarde les options de convert-to-html, il y a assez de quoi s'amuser 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 . Link to comment Share on other sites More sharing options...
TheKillerOfComputer Posted August 6, 2018 Share Posted August 6, 2018 |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. Link to comment Share on other sites More sharing options...
mr.tux Posted August 6, 2018 Author Share Posted August 6, 2018 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 # 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 ! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.