2012-06-29 2 views
6

Ok, das könnte beantwortet worden sein, aber ich bin neu und versuche zu lernen, also denke ich, dass ich es nicht "bekomme". Ich habe eine Variable, die eine Tabelle von Informationen enthält (ich habe es aus einer SQL-Abfrage). Ich kann die Variable auf dem Bildschirm ausgeben und sehe die Tabelle, aber wenn ich versuche, eine HTML-E-Mail damit im Körper zu erstellen, wird es verstümmelt. HierPowerShell Anzeigetabelle in HTML E-Mail

ist der Code:

# This code sets up the HTML table in a more friendly format 
$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 + "</style>" 

# This code defines the search string in the IssueTrak database tables 
$SQLServer = "Blah" 
$SQLDBName = "Blah" 
$SQLUsername = "Blah" 
$SQLPassword = "Blah" 
$SQLQuery = "SELECT u.FirstName,u.LastName,u.EMail,COUNT(UserID) as Count 
     FROM dbo.Issues i with(nolock) 
     JOIN DBO.Users u with(nolock) on u.UserID = i.NextActionBy 
     where i.Status='Open' 
     group by u.FirstName,u.LastName,u.EMail 
     order by Count(*) desc" 

# This code connects to the SQL server and retrieves the data 
$SQLConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; uid = $SQLUsername; pwd = $SQLPassword" 

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 

$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 

# This code outputs the retrieved data 
$DataSet.Tables | Format-Table -Auto 

# This code emails a report regarding the results of the retrieved data 
$smtpServer = "Blah" 
$smtpFrom = "Blah" 
$smtpTo = "Blah" 
$messageSubject = "IssueTrak Open Issues By Next Action Report" 
$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto 
$message.Subject = $messageSubject 
$message.IsBodyHTML = $true 
$message.Body = "Here is a listing of open issues in IssueTrak, sorted by Next Action.<br><br>" 
$message.Body = $message.Body + $html 

$smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($message) 

Die Ausgabe auf dem Bildschirm sieht wie folgt aus:

35 

FirstName LastName EMail        Count 
--------- -------- -----        ----- 
John  Doe  [email protected]      51 
Jane  Doe  [email protected]      20 

... aber die E-Mail-Körper sieht wie folgt aus:

Here is a listing of open issues in IssueTrak, sorted by Next Action. 

Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData 

Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData 

...und so weiter. Was mache ich falsch?

Antwort

10

Hier ist, wie ich es tun würde:

# Create a DataTable 
$table = New-Object system.Data.DataTable "TestTable" 
$col1 = New-Object system.Data.DataColumn Name,([string]) 
$col2 = New-Object system.Data.DataColumn Dept,([string]) 
$table.columns.add($col1) 
$table.columns.add($col2) 

# Add content to the DataTable 
$row = $table.NewRow() 
$row.Name = "John" 
$row.Dept = "Physics" 
$table.Rows.Add($row) 
$row = $table.NewRow() 
$row.Name = "Susan" 
$row.Dept = "English" 
$table.Rows.Add($row) 

# Create an HTML version of the DataTable 
$html = "<table><tr><td>Name</td><td>Dept</td></tr>" 
foreach ($row in $table.Rows) 
{ 
    $html += "<tr><td>" + $row[0] + "</td><td>" + $row[1] + "</td></tr>" 
} 
$html += "</table>" 

# Send the email 
$smtpserver = "smtpserver.domain.com" 
$from = "[email protected]" 
$to = "[email protected]" 
$subject = "test" 
$body = "Hi there,<br />Here is a table:<br /><br />" + $html 
Send-MailMessage -smtpserver $smtpserver -from $from -to $to -subject $subject -body $body -bodyashtml 
+1

+1 für die Verwendung von send-mailmessage mit -bodyAsHTML –

+0

Ich habe das versucht, aber ich bekomme Fehler. Ich habe den vollständigen Code geteilt, vielleicht kannst du sehen, was ich falsch mache? –

+0

OK, die erste Sache ist loswerden: '$ DataSet.Tables | Format-Tabelle -Auto' weil das nichts macht. Sie müssen '$ DataSet' nehmen und eine DataTable bekommen,' $ table = $ DataSet.Tables [0] '. Sobald Sie die DataTable haben, verwenden Sie mein Beispiel, um die $ html-Zeichenfolge manuell zu erstellen. –

2

Sie können versuchen, (nicht getestet):

$message.Body = $message.Body + ($DataSet.Tables | format-Table -auto | convertto-html) 
+0

Das ist nicht zu helfen schien, jetzt alles, was ich in der E-Mail bin immer eine Liste der GUID-ähnliche Zahlen ... –

+0

Dies funktioniert, aber Sie müssen die gewünschten Spalten in Ihrer Tabelle auswählen, da das Datentypenobjekt neben den benutzerdefinierten Spalten alle Arten von integrierten Eigenschaften enthält. , d. H. $ table | Wähle col1, col2, colN | convertto-html –

3

Ich denke, dies ist eine bessere Lösung ist (siehe Lit. 1)

$DataSet.Tables[0] |select * -ExcludeProperty RowError, RowState, HasErrors, Name, Table, ItemArray | ConvertTo-Html 

Mit der ExcludeProperty können wir alle die lauten Spalten aus unserer Tabelle ausschließen, ohne speziell angeben zu müssen, welche Spalten wir wollen

(1) http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/05/25/reinventing-the-wheel-automating-data-consistency-checks-with-powershell.aspx

0

generali Antwort:

$body+=($variable|Select-Object property1,property2|ConvertTo-Html)

+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/16774381) – OmG