2016-08-08 15 views
0

Ich habe eine Gruppe von einfachen PowerShell-Funktionen, die Systemstatistiken abrufen, konvertieren sie in HTML-Fragmente & dann am Ende alle zusammen in eine große HTML-Datei.ConvertTo-HTML <td> Klasse

Ich habe ein Problem mit einigen spezifischen Funktionen, während andere scheinen gut zu funktionieren, obwohl ich genau das gleiche Prinzip verwende.

Dies ruft die Systeminformationen:

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 
    } 
} 

Diese die Logik für die Funktion gilt und wendet die bedingte Formatierung für die Klasse des Ausgangs HTML-Code: -

$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>' 
        } 
       } 
      } 

Dies bindet sie alle zusammen und führt die td-Klasse-Tag-Ersatz:

$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 

Aber ich aus irgendeinem Grund eine sehr schiefe HTML-Ausgabe zu erhalten, scheint es mehr Tags als für jeden Wert erforderlich zu generieren: -

<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

'$ _. 'Fehlertyp' -match 'Fehler' -oder 'Critical'' sollte' $ _ 'sein. Fehlertyp' -match 'Fehler | Critical'', weil' -match' eine Regexp erwartet. – wOxxOm

+0

Dies erzeugt leider immer noch die gleiche HTML-Ausgabe für mich. Es scheint zusätzliche Tags zu generieren, daher ist die Tabelle verzerrt. –

+0

Es verursacht nicht das von Ihnen beobachtete Problem, aber es ist ein anderes Problem in Ihrem Code. Genauer gesagt, es ist nicht der Grund dafür, mehrere "" -Tags zu bekommen, aber der Grund, warum sie alle die Klasse 'danger' haben. –

Antwort

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

Die obige Aussage ersetzen wird mit der jedes<td> Element class Wert von alle Datensätze in $applogs, also Multiplikation der <td> Elemente, wenn $applogs mehr als einen Datensatz enthält.

An dem Punkt, an dem Sie Formatierungsinformationen hinzufügen möchten, verfügen Sie nicht mehr über die ursprünglichen Objekte. Daher müssen Sie die Informationen analysieren, um die Formatierung auf den von Ihnen erstellten HTML-Zeichenfolgen basieren zu lassen. Ich habe dir das schon gesagt, als ich deine original question beantwortet habe. Die Lösung bleibt (grundsätzlich) gleich.

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

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

Auch als @wOxxOm im comments to your question erwähnt die logische Operation $_.'Error Type' -match 'Error' -or 'Critical' nicht funktioniert, wie Sie zu erwarten scheinen. Der Ausdruck wird wie folgt bewertet:

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

weil non-empty strings evaluate to $true in Powershell, und ein boolean OR operation-$true ausgewertet wird, wenn mindestens ein Operand $true ist.

Wenn Sie möchten, mit der -match Operator halten Sie einen Wechsel in den regulären Ausdruck verwenden:

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

Sie können auch tun zwei separate -eq Vergleiche:

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

oder überprüfen, ob die Error Type Wert ist in einem Array gültiger Werte enthalten:

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