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) <= 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>
'$ _. 'Тип ошибки' -match 'Error' -or 'Critical'' должен быть' $ _.' Тип ошибки '-match' Error | Critical'', потому что '-match' ожидает регулярное выражение. – wOxxOm
Это, к сожалению, по-прежнему создает для меня тот же вывод HTML. Кажется, что генерирует дополнительные
Это не вызывает проблемы, которые вы наблюдаете, но это еще одна проблема в вашем коде. Более конкретно, это не причина получения нескольких тегов '
ответ
Данное заявление будет заменить каждый
<td>
элемент сclass
значение все записей в$applogs
, таким образом, умножая элементы<td>
, если$applogs
содержит более одной записи.В том месте, где вы пытаетесь добавить информацию о форматировании, у вас больше нет исходных объектов, поэтому вам нужно проанализировать информацию, чтобы основывать ваше форматирование, вне строков HTML, которые вы создали. Я уже говорил вам, что когда я ответил на ваш original question. Решение остается (в основном) одинаковым.
Кроме того, как @wOxxOm упоминается в comments to your question логическая операция
$_.'Error Type' -match 'Error' -or 'Critical'
не работает, как вы, кажется, ожидать. Выражение вычисляется следующим образом:, потому что non-empty strings evaluate to
$true
в PowerShell, а boolean OR operation вычисляется в$true
, если по крайней мере, один операнд$true
.Если вы хотите сохранить с помощью оператора
-match
вы можете использовать чередование в регулярном выражении:Вы также можете сделать две отдельные
-eq
сравнения:или, если проверить
Error Type
содержится в массиве допустимых значений:источник
2016-08-08 12:06:05
Смежные вопросы