9

好的,这可能已经回答了,但我是新手并且正在努力学习,所以我想我没有“得到”它。我有一个包含信息表的变量(我从 SQL 查询中得到它)。我可以将变量输出到屏幕并查看表格,但是当我尝试在正文中使用它构建 HTML 电子邮件时,它会出现乱码。

这是代码:

# 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        John.Doe@blah.com                       51
Jane        Doe        Jane.Doe@blah.com                       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 

...等等。我究竟做错了什么?

4

7 回答 7

15

这是我的做法:

# 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 = "user@domain.com"
$to = "user@domain.com"
$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
于 2012-06-29T14:51:48.957 回答
7

我认为这是一个更好的解决方案(参见参考文献 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

于 2015-03-24T16:12:37.977 回答
3

您可以尝试(未测试):

$message.Body = $message.Body + ($DataSet.Tables | format-Table -auto |  convertto-html)
于 2012-06-29T14:29:55.550 回答
3

我这样使用:

Import-Module C:\dbatools\dbatools.psd1

$HostName = Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name
$DiskResult = Get-DbaDiskSpace -ComputerName $HostName | Sort-Object $_.FreeInGB | Out-DbaDataTable

# Create column headers of Table1
$HtmlTable1 = "<table border='1' align='Left' cellpadding='2' cellspacing='0' style='color:black;font-family:arial,helvetica,sans-serif;text-align:left;'>
<tr style ='font-size:13px;font-weight: normal;background: #FFFFFF'>
<th align=left><b>ComputerName</b></th>
<th align=left><b>Name</b></th>
<th align=left><b>Label</b></th>
<th align=left><b>SizeInGB</b></th>
<th align=left><b>FreeInGB</b></th>
<th align=left><b>PercentFree</b></th>
</tr>"

# Insert data into Table1
foreach ($row in $DiskResult)
{ 
    $HtmlTable1 += "<tr style='font-size:13px;background-color:#FFFFFF'>
    <td>" + $row.ComputerName + "</td>
    <td>" + $row.Name + "</td>
    <td>" + $row.Label + "</td>
    <td>" + $row.SizeInGB + "</td>
    <td>" + $row.FreeInGB + "</td>
    <td>" + $row.PercentFree + "</td>
    </tr>"
}
$HtmlTable1 += "</table>"

# Send Mail Inputs
$smtpserver = "smtp.domain.com"
$from = "Powershell Mail <" + $HostName + "@domain.com>"
$to = "<mail1@domain.com>", "<mail2@domain.com>"
$cc = "<mail3@domain.com>" , "<mail4@domain.com>"
$subject = "Disk Check for SQL Server"
$body = "Disk info for SQL Server like below:<br/><br/>" + $HtmlTable1

Send-MailMessage -smtpserver $smtpserver -from $from -to $to -cc $cc -subject $subject -body $body -bodyashtml
于 2018-06-28T12:40:23.803 回答
1

对于寻找简单桌子的人,这是我找到的

首先添加以下变量

$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@

你可以像下面那样添加

Get-PSDrive | ConvertTo-Html -Property Name,Used,Provider,Root,
CurrentLocation 
-Head $Header | Out-File -FilePath PSDrives.html

读取文件时,请确保使用-raw如下参数

Get-ChildItem Cert:\LocalMachine\My  | Where-Object {$_.NotAfter -ge (get-date -DisplayHint Date) } |ConvertTo-Html -Property Issuer,Thumbprint,Notafter -Head $Header | Out-File C:\Iris\Cert.html
$body=Get-Content -Path C:\Iris\cert.html -Raw

然后在发送邮件时,你可以做

send-emailmessage -body $body -bodyashtml #other values

参考资料:
https ://4sysops.com/archives/building-html-reports-in-powershell-with-convertto-html/

于 2018-08-26T11:22:41.813 回答
0

笼统的回答:

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

只需使用您自己的变量和属性。当其他人寻找解决方案时,这就是我们希望看到的。

于 2017-07-20T13:21:32.003 回答
0

以 user1491315 答案为基础。

$html = "<table border='1'><tr>"
$tableCol = $table.Columns | select Caption
foreach($col in $tableCol){
    $html += "<td>" + $col.Caption + "</td>"
}
    $html += "</tr>"
$tableColCount = $table.Columns.Count
foreach ($row in $table.Rows)
{
    $html += "<tr>"
    For ($i=0; $i -le $tableColCount; $i++) {
        $html += "<td>" + $row[$i] + "</td>"
    }
    $html += "</tr>"
}
$html += "</table>"

这做同样的事情,但会自动设置列名。

于 2020-06-15T09:36:23.903 回答