2016-08-08 3 views
0

システム統計情報を取得し、それらをHTMLフラグメント&に変換し、最後にすべてを1つの大きなHTMLファイルに結合する簡単なPowerShell関数のグループがあります。ConvertTo-HTML​​クラス

私はいくつかの特定の機能に問題がありますが、まったく同じ原則を使用していますが、他の機能は正常に動作しているようです。

これは、システム情報を取得:

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 

上記のステートメントは、とすべての<td>要素を置き換えます

<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'または 'Critical''は' $ _'です。エラータイプ '-match' Error | Critical''は '-match'が正規表現を期待するためです。 – wOxxOm

+0

これは残念なことに同じHTML出力を生成します。追加の​​タグが生成されているようで、テーブルが歪んでいます。 –

+0

問題は発生していませんが、コードには別の問題があります。具体的には、複数の '​​'タグを取得する理由ではありませんが、それらすべてがクラス '危険'を持つ理由です。 –

答えて

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

- :私は非常に偏っHTML出力を取得し、いくつかの理由で、各値のために必要以上のタグを生成しているようですclassの値がであり、すべてのレコードが$applogsであるため、$applogsに複数のレコードが含まれている場合は、<td>の要素を掛けます。

書式設定情報を追加しようとしているところに元のオブジェクトがないため、作成したHTML文字列の書式に基づいて情報を解析する必要があります。私はあなたの答えがoriginal questionであるときに私はすでにそれを話しました。解決策は(基本的に)同じままです。 @wOxxOmがcomments to your questionで述べたようにあなたが期待するように見えるよう

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

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

また、論理演算$_.'Error Type' -match 'Error' -or 'Critical'は動作しません。少なくとも一つのオペランドが$trueある場合PowerShellでnon-empty strings evaluate to $true、およびboolean OR operation$trueに評価されるため

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

:式は次のように評価されます。

あなたが正規表現で交互に使用することができます-match演算子使用して保存したい場合:

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

かどうかをチェック:

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

をあなたはまた、2つの別々の-eq比較を行うことができますError Typeの値は、有効な値の配列に格納されます。

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