2012-06-29 1 views
6

Хорошо, на это, возможно, был дан ответ, но я новичок и стараюсь учиться, поэтому, я думаю, я не «получаю» это. У меня есть переменная, которая содержит таблицу информации (я получил ее из SQL-запроса). Я могу вывести переменную на экран и посмотреть таблицу, но когда я пытаюсь создать HTML-письмо с ним в теле, оно становится искаженным.Таблица отображения PowerShell в HTML Email

Вот код:

# 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) 

Выход на экране выглядит следующим образом:

35 

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

... но тело электронной почты выглядит следующим образом:

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 

...и так далее. Что я делаю не так?

ответ

10

Вот как я это сделать:

# 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 для использования send-mailmessage с -bodyAsHTML –

+0

Я пробовал это, но я получаю ошибки. Я поделился полным кодом, может быть, вы можете увидеть, что я делаю неправильно? –

+0

ОК, первое, что нужно избавиться: '$ DataSet.Tables | Format-Table -Auto' , потому что это ничего не делает. Вам нужно взять '$ DataSet' и получить DataTable,' $ table = $ DataSet.Tables [0] '. Когда у вас есть DataTable, используйте мой пример, чтобы вручную создать строку $ html. –

2

Вы можете попробовать (не проверено):

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

Это не похоже, чтобы помочь, теперь все, что я получаю в электронной почте список GUID-подобных номеров ... –

+0

это будет работать, но вы выбираете конкретные столбцы, которые вы хотите в своей таблице, потому что объект данных включает в себя все виды встроенных свойств, помимо ваших собственных столбцов. i.e. $ table | выберите col1, col2, colN | convertto-html –

3

Я думаю, что это лучшее решение (см 1)

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

С ExcludeProperty мы все можем исключить шумные столбцы из нашей таблицы без необходимости указывать, какие колонки нам нужны.

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

0

обобщенный ответ:

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

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/16774381) – OmG

Смежные вопросы