我有2个脚本
script1具有以下内容:
$exportObject = New-Object System.Collections.ArrayList
$exportObject | Select-Object
在script2中,我正在调用script1做某事并将输出传递到-ov
& "script1.ps1" -ov $outputValue
$outputValue
这就是我得到的
现在,我正在尝试将变量输出发送到电子邮件正文中。
Send-MailMessage -From $FromEm -Subject $Subject -To "user@domain.com" -Body $outputValue -BodyAsHtml -SmtpServer $SmtpServer -Port $Port -Credential $Creds -UseSsl
Send_mailMessage将不接受这样的ArrayList变量,所以我要先转换为HTML,然后转换为字符串
$outputValue = $outputValue | ConvertTo-HTML <# -As Table #> | Out-String
这会在电子邮件正文中发送以下内容:
很好,但我想使其看起来像桌子,带有边框样式等。
我该怎么做?
我在想这样的事情:
$outputValue = $outputValue | ConvertTo-HTML | foreach-object{if($outValue.header) {<th></th>} else <td></td>} | Out-String
尽管那是我的初衷,但不确定如何准确地做到这一点
答案 0 :(得分:1)
您当然可以通过HTML样式发挥自己的创造力。 下面的代码对表格进行样式设置:
# just some fake data here
$exportObject = @(
[PSCustomObject]@{
'Server' = 'Server1.com'
'Cube' = 'Cube1'
'Connection Details' = 'Connection changed!'
},
[PSCustomObject]@{
'Server' = 'Server2.com'
'Cube' = 'Cube2'
'Connection Details' = 'Connection Unchanged!'
},
[PSCustomObject]@{
'Server' = 'Server3.com'
'Cube' = 'Cube3'
'Connection Details' = 'Connection changed!'
}
)
function ConvertTo-HTMLTable ($obj) {
# Accepts a System.Data.DataTable object or an array of PSObjects and converts to styled HTML table
# add type needed to replace HTML special characters into entities
Add-Type -AssemblyName System.Web
$sb = New-Object -TypeName System.Text.StringBuilder
[void]$sb.AppendLine('<table>')
if ($null -ne $obj) {
if (([object]$obj).GetType().FullName -eq 'System.Data.DataTable'){
# it is a DataTable; convert to array of PSObjects
$obj = $obj | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors
}
$headers = $obj[0].PSObject.Properties | Select -ExpandProperty Name
[void]$sb.AppendLine('<thead><tr>')
foreach ($column in $headers) {
[void]$sb.AppendLine(('<th>{0}</th>' -f [System.Web.HttpUtility]::HtmlEncode($column)))
}
[void]$sb.AppendLine('</tr></thead><tbody>')
$row = 0
$obj | ForEach-Object {
# add inline style for zebra color rows
if ($row++ -band 1) {
$tr = '<tr style="background-color: {0};">' -f $oddRowBackColor
}
else {
$tr = '<tr>'
}
[void]$sb.AppendLine($tr)
foreach ($column in $headers) {
[string]$val = $($_.$column)
if ([string]::IsNullOrWhiteSpace($val)) {
$td = '<td> </td>'
}
else {
$td = '<td>{0}</td>' -f [System.Web.HttpUtility]::HtmlEncode($val)
}
[void]$sb.Append($td)
}
[void]$sb.AppendLine('</tr>')
}
[void]$sb.AppendLine('</tbody>')
}
[void]$sb.AppendLine('</table>')
return $sb.ToString()
}
$headerBackColor = '#4F81BD' # backgroundcolor for column headers
$oddRowBackColor = '#DCE6F1' # background color for odd rows
$style = @"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Report</title>
<meta name="generator" content="PowerShell" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body {
font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
font-size: 12px;
color: black;
}
table, td, th {
border-color: black;
border-style: solid;
font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
font-size: 11px;
}
table {
border-width: 0 0 1px 1px;
border-spacing: 0;
border-collapse: collapse;
}
td, th {
margin: 0;
padding: 4px;
border-width: 1px 1px 0 0;
text-align: left;
}
th {
color: white;
background-color: $headerBackColor;
font-weight: bold;
}
</style>
"@
$body = '{0}</head><body>{1}</body></html>' -f $style, (ConvertTo-HTMLTable $exportObject)
Send-MailMessage -From $FromEm -Subject $Subject -To "user@domain.com" -Body $body -BodyAsHtml -SmtpServer $SmtpServer -Port $Port -Credential $Creds -UseSsl
可以找到两个模拟MS Word Grid Table 5 Dark Accent 5
的表样式示例here
希望有帮助
答案 1 :(得分:0)
不确定您出了什么问题。这对我有用:
$Body = Get-ChildItem C:\Windows\ -File |
Select-Object -Property Name, Length, LastWriteTime -First 10 |
ConvertTo-Html -As Table -Head '<style type="text/css">th,td { text-align:center; }</style>' |
Out-String
Send-MailMessage -SmtpServer $SmtpServer -UseSsl -Subject $Subject -To $To -From $From -Body $Body -BodyAsHtml