Как отформатировать объект в красивую таблицу HTML? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть 2 сценария

script1 имеет следующее:

$exportObject = New-Object System.Collections.ArrayList
$exportObject | Select-Object

в script2, я вызываю script1, чтобы что-то сделать, и отправляю вывод в -ov

& "script1.ps1" -ov $outputValue
$outputValue

вот что я получаю

output

Теперь я пытаюсь отправить вывод этой переменной в теле письма.

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

, в теле письма будет отправлено следующее:

c

это хорошо, но я бы хотел, чтобы это выглядело как таблица, со стилями границ и т. Д.

как я могу это сделать?

iя думаю что-то вроде этого:

$outputValue = $outputValue | ConvertTo-HTML | foreach-object{if($outValue.header) {<th></th>} else <td></td>} | Out-String

хотя это грубое представление о том, что я имею в виду, и не знаю, как это сделать точно

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Конечно, вы можете быть настолько креативными, насколько захотите, с помощью стиля HTML. Ниже приведен код стиля таблицы следующим образом:

enter image description here

# 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>&nbsp;</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, можно найти здесь

Надеюсь, это поможет

0 голосов
/ 03 июля 2019

Не уверен, что для тебя не так. Это работает для меня:

$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
...