Powershell: отображать заголовки таблиц один раз вверху в html-отчете.

Я пытаюсь создать отчет по электронной почте, чтобы отобразить список неудачных/успешных заданий резервного копирования.

Вот мой сценарий:

$servers = @(gc config\dbs.txt)
foreach($server in $servers)
{
  $dt = new-object "System.Data.DataTable"
  $cn = new-object System.Data.SqlClient.SqlConnection "server=$server;database=msdb;Integrated Security=sspi"
  $cn.Open()
  $sql = $cn.CreateCommand()
  $sql.CommandText = $(get-content config\query.sql)
  $rdr = $sql.ExecuteReader()
  $dt.Load($rdr)
  $cn.Close()
  $dt |ft Server,RunStatus,JobName >> $log
  $dt | ConvertTo-Html Server,JobName,RunStatus -head $a | ac logs\backups\report.htm    
}

Server      JobName     RunStatus
srv1        job1        success
srv1        job2        success
Server      JobName     RunStatus
srv2        job1        fail
srv2        job2        success
srv2        job3        success
Server      JobName     RunStatus
srv3        job1        fail
srv3        job2        success
srv3        job3        success
Server      JobName     RunStatus
srv4        job1        fail
srv4        job2        success
srv4        job3        success
Server      JobName     RunStatus
srv5        job1        fail

Я получаю имена заголовков несколько раз, так как содержимое html-файла добавляется после каждого перечисления foreach. Могу ли я изменить свой сценарий, чтобы заголовок [Server JobName RunStatus] отображался вверху только один раз?

Также я хочу знать, возможно ли отображать report.htm как встроенное содержимое в почте, а не вложение. Это возможно?

Заранее спасибо.
steeluser


person Animesh    schedule 13.04.2011    source источник


Ответы (1)


Заголовки таблиц отображаются для каждого перечисления, потому что вы используете ConvertTo-HTML в каждом перечислении :). То же самое относится и к format-table. Попробуйте это:

$dts = @()

@(gc config\dbs.txt) | % {
  $dt = new-object "System.Data.DataTable"
  $cn = new-object System.Data.SqlClient.SqlConnection "server=$server;database=msdb;Integrated Security=sspi"
  $cn.Open()
  $sql = $cn.CreateCommand()
  $sql.CommandText = $(get-content config\query.sql)
  $rdr = $sql.ExecuteReader()
  $dt.Load($rdr)
  $cn.Close()
  $dts += $dt
}

$dts |ft Server,RunStatus,JobName >> $log
$dts | ConvertTo-Html Server,JobName,RunStatus -head $a | ac logs\backups\report.htm    
person Emiliano Poggi    schedule 13.04.2011
comment
Спасибо эмпо!! Это сработало. Я пробовал $dts += $dt раньше, но это не удалось, потому что я все еще выполнял ConvertToHtml в самом цикле.. поэтому я получал только последний набор результатов из $dt, и это НЕ происходило мне, что я делал неправильно .. я думаю, долгие часы работы делают это с вами .. Ура :-) - person Animesh; 13.04.2011
comment
ответ на мой второй вопрос выглядит слишком сложным для меня.. думаю, мне нужно немного отдохнуть, чтобы разобраться с этим.. спасибо, что дали мне отправную точку.. :-) Хорошего дня. - person Animesh; 13.04.2011
comment
Во втором ответе у вас есть только ссылка на функцию. Вы можете загрузить функцию, найти соответствующий .ps1 в своем скрипте, а затем вызвать функцию, как если бы вы делали это с любым другим командлетом :) - person Emiliano Poggi; 13.04.2011