2016-08-08 1 views
0

У меня есть группа простых функций PowerShell, которые извлекают системную статистику, конвертируют их в HTML-фрагменты &, а затем объединяют все вместе в один большой HTML-файл в конце.ConvertTo-HTML <td> Класс

У меня проблема с некоторыми конкретными функциями, тогда как другие, похоже, работают нормально, хотя я использую точно такой же принцип.

Это извлекает информацию о системе:

function Get-ApplicationLogs { 
    $query = '<QueryList> 
       <Query Id="0" Path="Application"> 
       <Select Path="Application">*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]</Select> 
       </Query> 
       </QueryList>' 

    $logs = Get-WinEvent -ComputerName $ComputerName -ErrorAction SilentlyContinue -FilterXml $query | Sort-Object {$_.Id} 

    foreach ($log in $logs) { 
     $props = [ordered]@{'Id'=$log.Id; 
        'Error Type'=$log.LevelDisplayName; 
        'Provider Name'=$log.ProviderName; 
        'Timestamp'=$log.TimeCreated; 
        'Message'=$log.Message; 
       } 

     $obj = New-Object -TypeName PSObject -Property $props 

     Write-Output $obj 
    } 
} 

Это применяет логику к функции и применяется условное форматирование для класса выходного HTML код: -

$applogs = Get-ApplicationLogs -computername $computername | 
      Select -Property *,@{ 
       name='class';e={ 
        if ($_.'Error Type' -match 'Error' -or 'Critical') { 
         '<td class="danger">' 
        } elseif ($_.'Error Type' -match 'Warning') { 
         '<td class="warning">' 
        } else { 
         '<td>' 
        } 
       } 
      } 

Это связывает все вместе и выполняет замену тега класса td:

$frag8 = $applogs | Select 'ID','Error Type','Provider Name','Timestamp','Message' | 
     ConvertTo-Html -As Table -Fragment -PreContent '<hr>', '<h3>Application Logs</h3>' | 
     foreach { $_ -replace '<td>',$($applogs.class) } | 
     Out-String 

Но по какой-то причине, я получаю очень искаженное вывод HTML, кажется, генерировать больше тегов, чем требуется для каждого значения: -

<hr> 
<h3>Application Logs</h3> 
<table> 
<colgroup><col/><col/><col/><col/><col/></colgroup> 
<tr><th>Id</th><th>Error Type</th><th>Provider Name</th><th>Timestamp</th><th>Message</th></tr> 
<tr> 
<td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger">10021</td> 
<td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger">Warning</td> 
<td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger">Windows Server Update Services</td> 
<td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger">08/08/2016 04:37:42</td> 
<td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger"> <td class="danger">The catalog was last synchronized successfully 1 or more days ago.</td> 
</tr> 
+1

'$ _. 'Тип ошибки' -match 'Error' -or 'Critical'' должен быть' $ _.' Тип ошибки '-match' Error | Critical'', потому что '-match' ожидает регулярное выражение. – wOxxOm

+0

Это, к сожалению, по-прежнему создает для меня тот же вывод HTML. Кажется, что генерирует дополнительные теги, поэтому таблица искажена. –

+0

Это не вызывает проблемы, которые вы наблюдаете, но это еще одна проблема в вашем коде. Более конкретно, это не причина получения нескольких тегов '', но причина, почему все они имеют класс« опасность ». –

ответ

0
foreach { $_ -replace '<td>',$($applogs.class) } 

Данное заявление будет заменить каждый<td> элемент с class значение все записей в $applogs, таким образом, умножая элементы <td>, если $applogs содержит более одной записи.

В том месте, где вы пытаетесь добавить информацию о форматировании, у вас больше нет исходных объектов, поэтому вам нужно проанализировать информацию, чтобы основывать ваше форматирование, вне строков HTML, которые вы создали. Я уже говорил вам, что когда я ответил на ваш original question. Решение остается (в основном) одинаковым.

$re = '<tr><td>.*?</td><td>(Error|Warning)</td>' 

... | ForEach-Object { 
    if ($_ -match $re) { 
    $type = $matches[1] 
    $_ -replace '<td>', "<td class='$type'>" 
    } else { 
    $_ 
    } 
} | ... 

Кроме того, как @wOxxOm упоминается в comments to your question логическая операция $_.'Error Type' -match 'Error' -or 'Critical' не работает, как вы, кажется, ожидать. Выражение вычисляется следующим образом:

$_.'Error Type' -match 'Error' -or 'Critical' 
($_.'Error Type' -match 'Error') -or ('Critical') 
($_.'Error Type' -match 'Error') -or ($true) 
$true 

, потому что non-empty strings evaluate to $true в PowerShell, а boolean OR operation вычисляется в $true, если по крайней мере, один операнд $true.

Если вы хотите сохранить с помощью оператора -match вы можете использовать чередование в регулярном выражении:

$_.'Error Type' -match 'Error|Critical' 

Вы также можете сделать две отдельные -eq сравнения:

$_.'Error Type' -eq 'Error' -or $_.'Error Type' -eq 'Critical' 

или, если проверить Error Type содержится в массиве допустимых значений:

'Error', 'Critical' -contains $_.'Error Type'