Convertto-HTML выводит предварительный / пост контент, отображаемый как System.String [] вместо реального контента - PullRequest
1 голос
/ 10 февраля 2011

Я пытаюсь использовать Powershell для вывода таблицы с некоторым содержимым до и после публикации, а затем отправить ее по электронной почте, но содержимое до и после публикации отображается в письме как «System.String []». Остальное содержимое выглядит нормально, и если я выведу строку HTML на консоль, все будет хорошо.

function Send-SMTPmail($to, $from, $subject, $smtpserver, $body) {
    $mailer = new-object Net.Mail.SMTPclient($smtpserver)
    $msg = new-object Net.Mail.MailMessage($from,$to,$subject,$body)
    $msg.IsBodyHTML = $true
    $mailer.send($msg)
}

$Content = get-process | Select ProcessName,Id
$headerString = "<table><caption> Foo. </caption>"
$footerString = "</table>"
$MyReport = $Content | ConvertTo-Html -fragment -precontent $headerString -postcontent $footerString

send-SMTPmail "my Email" "from email" "My Report Title" "My SMTP SERVER" $MyReport

Появляется в моей электронной почте как:

System.String[]
ProcessName Id
...             ...
System.String[]

Выполнение внешнего файла, а затем элемента invoke приводит к тем же результатам, что и отправка электронного письма ...

Ответы [ 2 ]

5 голосов
/ 10 февраля 2011

ConvertTo-Html возвращает список объектов - некоторые являются строками, а некоторые являются строковыми массивами, например:

407# $headerString = "<table><caption> Foo. </caption>"
408# $footerString = "</table>"
409# $content = Get-Date | select Day, Month, Year
410# $MyReport = $Content | ConvertTo-Html -Fragment -PreContent $headerString `
                                           -PostContent $footerString
411# $MyReport | Foreach {$_.GetType().Name}
String[]
String
String
String
String
String
String
String
String
String
String[]

Таким образом, $ MyReport содержит массив как строк, так и строковых массивов.Когда вы передаете этот массив конструктору MailMessage, который ожидает строку типа, PowerShell пытается принудительно преобразовать это в строку.Результат:

412# "$MyReport"
System.String[] <table> <colgroup> <col/> <col/> <col/> </colgroup> <tr><th>Day
</th><th>Month</th><th>Year</th></tr> <tr><td>9</td><td>2</td><td>2011
</td></tr> </table> System.String[]

Простое решение - запустить вывод от ConverTo-Html до Out-String, что приведет к тому, что $ MyReport будет представлять собой одну строку:

413# $MyReport = $Content | ConvertTo-Html -Fragment -PreContent $headerString `
                                           -PostContent $footerString |
                            Out-String
414# $MyReport | Foreach {$_.GetType().Name}
String
0 голосов
/ 10 февраля 2011

convertto-html возвращает список строк, а не строку.Поэтому я думаю, что $ myreport в конечном итоге является массивом объектов;например, попробуйте это:

$Content = get-process | Select ProcessName,Id
$headerString = "<table><caption> Foo. </caption>"
$footerString = "</table>"
$MyReport = $Content | ConvertTo-Html -fragment -precontent $headerString -postcontent $footerString
get-member -input $MyReport

Вместо того, чтобы принудительно указывать $ myreport в строку, перед передачей его в send-SMTPMail:

$MyReport = ( $Content | ConvertTo-Html -fragment -precontent $headerString -postcontent $footerString ) -join "`n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...