mr.tux Posté(e) le 3 août 2018 Partager Posté(e) le 3 août 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 ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheKillerOfComputer Posté(e) le 3 août 2018 Partager Posté(e) le 3 août 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> Lien vers le commentaire Partager sur d’autres sites More sharing options...
mr.tux Posté(e) le 4 août 2018 Auteur Partager Posté(e) le 4 août 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 ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sheepux Posté(e) le 4 août 2018 Partager Posté(e) le 4 août 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
mr.tux Posté(e) le 4 août 2018 Auteur Partager Posté(e) le 4 août 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sheepux Posté(e) le 5 août 2018 Partager Posté(e) le 5 août 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 . Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheKillerOfComputer Posté(e) le 6 août 2018 Partager Posté(e) le 6 août 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
mr.tux Posté(e) le 6 août 2018 Auteur Partager Posté(e) le 6 août 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 ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.