none
Рассылка уведомления о принтерах в удобно читаемом виде/ Помогите с ConvertTo-Html RRS feed

  • Вопрос

  • Есть скрипт выводящий список принтеров с состоянием очереди отличным от Ready. Вот код:

    $Printers = Get-WmiObject Win32_Printer -ComputerName ag-print01.aton.global

    $status = @{0 = "Ready"; 1 = "Paused"; 2 = "Error"; 4 = "Pending
    Deletion"
    ; 8 = "Paper Jam"; 16 = "Paper Out"; 32 = "Manual
    Feed"
    ; 64 = "Paper Problem"; 128 = "Offline"; 256 = "I/O
    Active"
    ; 512 = "Busy"; 1024 = "Printing"; 2048 = "Output
    Bin Full"
    ; 4096 = "Not Available"; 8192 = "Waiting"; 16384 = "Processing"; 32768 = "Initialization"; 65536 = "Warming
    Up"
    ; 131072 = "Toner Low"; 262144 = "No Toner"; 524288 = "Page
    Punt"
    ; 1048576 = "User Intervention Required"; 2097152 = "Out of
    Memory"
    ; 4194304 = "Door Open"; 8388608 = "Server_Unknown"; 16777216 = "Power
    Save"
    }

    $ofs = "-"

    Foreach($Printer in $Printers)

    {

          if($Printer.PrinterState)

          {

                $finalstatus = $status.Keys | where { $_ -band $Printer.PrinterState } | foreach { $status.Get_Item($_) }

                $ListOfPrintersToBeSent += "{0,-10} {1,-40} {2,-30}`n" -f $Printer.Name,[string]$finalstatus,$Printer.Location

          }

    }

    Send-MailMessage -From "test@aton.ru" -To "test@aton.ru" -Subject "Test email" -Body $ListOfPrintersToBeSent -SmtpServer "srvmail.aton.global" -Encoding ([System.Text.Encoding]::Unicode)

    #$ListOfPrintersToBeSent

    Скрипт замечательно работает. Если вывести результат в консоль (последняя строка если без #), то все красиво. Проблема только в одном - при чтении письма в outlook 2010 все форматирование идет коту под хвост (оно и понятно, дефолтный шрифт не моноширинный в отличии от окна powershell). Напрашивается очевидный вариант - составить сообщение в виде html таблицы и выслать. К сожалению я не смог понять как мне передать все собранные данные в ConvertTo-Html. Все виденные мной примеры использовали конвейер.

    Может есть какое-то элегантное решение?

    P.S. прошу обратить внимание, что перед выводом происходит расшифровка состояния очереди печати, так что в лоб дополнить первую строку конвейером не выйдет. Читать текст все же удобней чем лезть в доки за кодом ошибки.

    Заранее спасибо!

    27 марта 2012 г. 14:48

Ответы

  • $body = $Printers | Select Name,@{n="Status";e={
    	([int[]]$_.PrinterState | % {$status[$_]}) -join "-"}},Location | ConvertTo-Html | Out-String
    	
    Send-MailMessage -From "test@aton.ru" -To "test@aton.ru" -Subject "Test email" `
    	-Body $Body -SmtpServer "srvmail.aton.global" -Encoding ([System.Text.Encoding]::Unicode) -BodyAsHtml

    • Помечено в качестве ответа simtox 29 марта 2012 г. 5:31
    28 марта 2012 г. 9:55
    Отвечающий
  • Заменить на :

    e={$printer = $_;($status.Keys | where {$_ -band $printer.PrinterState} | foreach {$status[$_]}) -join "-"}}



    • Изменено KazunEditor 28 марта 2012 г. 14:28
    • Помечено в качестве ответа simtox 29 марта 2012 г. 5:31
    28 марта 2012 г. 14:15
    Отвечающий

Все ответы

  • $body = $Printers | Select Name,@{n="Status";e={$status[[int]$_.PrinterState]}},Location | Format-List | Out-String
    	
    Send-MailMessage -From "test@aton.ru" -To "test@aton.ru" -Subject "Test email" `
    	-Body $Body -SmtpServer "srvmail.aton.global" -Encoding ([System.Text.Encoding]::Unicode)


    • Изменено KazunEditor 27 марта 2012 г. 15:07
    27 марта 2012 г. 15:06
    Отвечающий
  • Выводите в CSV и смотрите в Excel.
    27 марта 2012 г. 20:27
  • Спасибо, но это не то, что нужно.

    Во-первых удобней смотреть все же Table, а не List. Во-вторых как я уже упомянал из-за использования в Outlook немоноширинного шрифта при просмотре писем в Plain Text форматирование нарушается. В-третьих, мелочь конечно, но у принтера может быть сразу несколько состояний (у меня например есть принтер с тремя состояними Printing-Offline-Error), что в вашем скрипте не учитывается.

    Может все-таки объясните начинающему как к моему скрипту прикрутить ConvertTo-Html?

    P.S. По поводу CSV - нужно именно письмо, которое можно прочитать хоть с экрана смартфона

    P.P.S. Только сейчас обнаружил кнопку "Вставить блок кода" на форуме. Впредь буду использовать:)

    28 марта 2012 г. 5:41
  • $body = $Printers | Select Name,@{n="Status";e={
    	([int[]]$_.PrinterState | % {$status[$_]}) -join "-"}},Location | ConvertTo-Html | Out-String
    	
    Send-MailMessage -From "test@aton.ru" -To "test@aton.ru" -Subject "Test email" `
    	-Body $Body -SmtpServer "srvmail.aton.global" -Encoding ([System.Text.Encoding]::Unicode) -BodyAsHtml

    • Помечено в качестве ответа simtox 29 марта 2012 г. 5:31
    28 марта 2012 г. 9:55
    Отвечающий
  • Это уже максимально близко к тому, что ожидалось. Осталось передалать кусок кода:

    e={([int[]]$_.PrinterState | % {$status[$_]}) join "-"}

    Дело в том, что коды состояний принтера представляют собой 32битное число, сравнивая которое бинарно (по маске) мы и получаем искомые коды состояния. Например упомянутое мной состояние Printing-Offline-Error представляет собой код состояния 1154 (1024 + 128 + 2). Используя ваш код резонно получаем пустое значение.

    Чувствую, что не сложно, но сделать не получается:(

    P.S. всего-то и надо бинарно сравнить каждое возможное значение статуса с полученным и подошедшие статусы объединить в выходную строку. К сожалению не дружу я с конвейерами, так что прошу сильно не бить.

    • Изменено simtox 28 марта 2012 г. 13:48 Добавил P.S.
    28 марта 2012 г. 13:34
  • Заменить на :

    e={$printer = $_;($status.Keys | where {$_ -band $printer.PrinterState} | foreach {$status[$_]}) -join "-"}}



    • Изменено KazunEditor 28 марта 2012 г. 14:28
    • Помечено в качестве ответа simtox 29 марта 2012 г. 5:31
    28 марта 2012 г. 14:15
    Отвечающий
  • Так просто:) Я все голову ломал как мне из одного конвейера в другом данные использовать. Что-то не пришло в голову самое простое - $printer = $_

    Спасибо!

    29 марта 2012 г. 5:30