none
Erstellung einer HTML Tabelle im Body einer Email RRS feed

  • Frage

  • Hallo zusammen,

    ich habe folgendes script:

    $style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
    $style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
    $style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
    $style = $style + "TD{border: 1px solid black; padding: 5px; }"
    $style = $style + "H2 {font-size:16px; font-weight: bold; font-family: sans-serif;}"
    $style = $style + "</style>"
    
    $body = ""
    $body += $Vari1 +  "FEHLER abc<br>"
    $body += $Vari2 + "FEHLER xyz<br>"
    
    $body = ConvertTo-HTML -Body $body -Head $style | Out-String


    Es wird ein Body im HTML-Stil erstellt. Jedoch wird keine Tabelle erstellt, sondern nur die Zeilen ausgegeben. Am Ende des Bodys sind diese Tags zu sehen:

    <table> </table> </body></html>   

    Scheinbar werden die Werte nicht vom TAg <table> </table> umschlossen.

    Hat jemand einen Tipp wie die Tabelle die Zeilen aufnimmt?
    In die erste Spalte so die vari und der Text in die zweite Spalte.

    Gruß

    Frank


    Donnerstag, 15. April 2021 11:05

Antworten

  • Die Vari wird durch $adServers = (Get-ADForest).globalcatalogs | sort befüllt und die zweite Spalte ist text.

    Der Code oben ist passend.

    Hmmm ... ich glaube, ich habe mich nicht deutlich genug ausgedrückt. Wenn Du eine HTML-Tabelle erstellt haben möchtest, musst Du ConvertTo-Html auch Daten (ein oder mehrere Objekte) anbieten, die man in einer Tabelle darstellen kann.

    Schau mal hier:

    $ProcessList = 
    Get-Process | 
    Where-Object MainWindowTitle | 
    Select-Object -First 5 -Property Processname, ID, MainWindowTitle
    
    $body = 
    $ProcessList | 
    ConvertTo-HTML -as Table | 
    Out-String
    
    $SendMailMessageParams = @{
        From       = 'FrankAus@Berlin.de'
        To         = 'FrankIn@Berlin.de'
        SmtpServer = 'FranksSmtpServer'
        Body       = "$body"
        BodyAsHtml = $true
        Subject    = 'ProcessList as table'
    }
    
    Send-MailMessage @SendMailMessageParams

    Wenn Du in diesem Schnipsel "From", "To" und "SmtpServer" an Deine Umgebung anpasst, sollte der Code so laufen. 

    Wenn Du einfach zwei unzusammenhängende Werte oder Arrays übergibst, kann PowerShell daraus keine Html-Tabelle bauen - es sollten strukturierte Daten sein. 


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 16. April 2021 11:33

Alle Antworten

  • Frank,

    bitte Code als Code formatieren! Danke.

    Bitte nochmal die Hilfe lesen! ;-) Das cmdlet ConvertTo-Html ist dafür gemacht, PowerSehll-Objekte in HTML umzuwandeln. Wenn Du dem cmdlet strukturierte Daten verfütterst, kannst Du mit dem Parameter "-As" und dem Wert "Table" die Ausgabe der Objekte beeinflussen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 15. April 2021 13:41
  • Code ist formatiert.

    Der Parameter zeigt kein anderes Verhalten

    $body = ConvertTo-HTML -Body $body -Head $style -As Table| Out-String
    Noch ein Tipp?
    Donnerstag, 15. April 2021 13:56
  • Der Parameter zeigt kein anderes Verhalten

    Das liegt aber nicht am cmdlet sondern daran, dass Du ihm quasi keinen passenden Input anbietest.

    Hier mal ein Schnipsel zur Veranschaulichung:

    Get-Process | 
        Select-Object -First 10 | 
            ConvertTo-Html -As Table | 
                Out-File -FilePath .\Process.html 
    Invoke-Expression .\Process.html

    Was willst Du denn eigentlich damit erreichen? Das Ganze wird ja wohl kaum dazu da sein, zwei Werte als HTML-Seite anzuzeigen, oder?  ;-)  :-D


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Donnerstag, 15. April 2021 15:17
    Donnerstag, 15. April 2021 15:16
  • Ich möchte eine Tabelle mit abgefragten Meldungen per email senden.
    Server und die Meldung.

    Haste Du einen anderen Ansatz?

    Freitag, 16. April 2021 07:36
  • mit abgefragten Meldungen

    Bitte nicht so genau! :-/ Wie wär's wenn Du den Code postest, den Du wirklich benutzt? Sensible Informationen solltest Du natürlich vorher entfernen.

    Haste Du einen anderen Ansatz?

    Der Ansatz ist ja nicht verkehrt - nur die Umsetzung.

    Hast Du den Code-Schnipsel mal probiert, den ich gepostet hatte?


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 16. April 2021 09:17
  • JA klar dein Schnipsel funktioniert. 

    Die Vari wird durch $adServers = (Get-ADForest).globalcatalogs | sort befüllt und die zweite Spalte ist text.

    Der Code oben ist passend.

    Freitag, 16. April 2021 10:37
  • Die Vari wird durch $adServers = (Get-ADForest).globalcatalogs | sort befüllt und die zweite Spalte ist text.

    Der Code oben ist passend.

    Hmmm ... ich glaube, ich habe mich nicht deutlich genug ausgedrückt. Wenn Du eine HTML-Tabelle erstellt haben möchtest, musst Du ConvertTo-Html auch Daten (ein oder mehrere Objekte) anbieten, die man in einer Tabelle darstellen kann.

    Schau mal hier:

    $ProcessList = 
    Get-Process | 
    Where-Object MainWindowTitle | 
    Select-Object -First 5 -Property Processname, ID, MainWindowTitle
    
    $body = 
    $ProcessList | 
    ConvertTo-HTML -as Table | 
    Out-String
    
    $SendMailMessageParams = @{
        From       = 'FrankAus@Berlin.de'
        To         = 'FrankIn@Berlin.de'
        SmtpServer = 'FranksSmtpServer'
        Body       = "$body"
        BodyAsHtml = $true
        Subject    = 'ProcessList as table'
    }
    
    Send-MailMessage @SendMailMessageParams

    Wenn Du in diesem Schnipsel "From", "To" und "SmtpServer" an Deine Umgebung anpasst, sollte der Code so laufen. 

    Wenn Du einfach zwei unzusammenhängende Werte oder Arrays übergibst, kann PowerShell daraus keine Html-Tabelle bauen - es sollten strukturierte Daten sein. 


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 16. April 2021 11:33
  • okay danke.

    Hast Du eine Lösung ohne Convertohtml?

    Ich hatte es mal so probiert:

    $Body =  @() 
    $body += New-Object -TypeName psobject -Property @{Server=$adServer; Meldung='FEHLER FailureCounts'}
    $body += New-Object -TypeName psobject -Property @{Server=$adServer; Meldung="FEHLER FailureCounts"}
    Die Tabelle in HTML wurde gebaut.

    In Outlook kamen nur die Werte an. ...;-(

    Freitag, 16. April 2021 13:04
  • okay danke.

    Hast Du eine Lösung ohne Convertohtml?

    Das kommt auf die "Struktur" und die "Volatilität" der Daten an. Wenn es eine kleine und quasi immer gleiche Menge an Daten ist, die Du ausgeben möchtest, könntest Du eine HTML-Datei-Vorlage bauen, die möglichst eindeutige Platzhalter enthält, die Du dann mittels -replace mit den produktiven Daten ersetzen könntest.

    Aber wie kommst Du eigentlich auf eine Tabelle? Die Liste der Global Catalog DCs ist ja nur eine Liste. Sind denn die anderen Daten, die Du übermitteln möchtest, wenigstens strukturierte Daten? Wie würden denn die Daten aussehen, wenn Du sie auf der Konsole ausgibst? Kannst Du ein Beispiel posten? (sensible Daten vorher entfernen oder unkenntlich machen!)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 16. April 2021 14:58