Convertto-Html: выделите ячейки со специальными значениями?

Следующий оператор сгенерирует битовую таблицу html.

ps | convertto-html

Я хочу сделать текст (или целую строку) "CPU (s)" красным цветом (добавить класс CSS к<td>) если значение больше, чем, скажем, 100? Html-код будет использоваться как тело письма, поэтому javascript не является опцией.

 bluuf07 июн. 2016 г., 21:28
Я сделал сценарий некоторое время назад, который делает это. Хитрость была в том, чтобы: установить переменную, в которой вы храните HTML, как тип [xml]. Затем я ищу элементы и устанавливаю класс, чтобы некоторые пользовательские CSS выделяли ячейки. Позже выложу образец (на моем телефоне атм)
 ca9163d906 июн. 2016 г., 19:17
Сгенерированный html будет использоваться как тело письма, поэтому javascript не поддерживается.
 Ansgar Wiechers06 июн. 2016 г., 19:11
Вам нужен CSS и JavaScript для этого. Или постобработать сгенерированный HTML-код (например, добавить класс CSS в<td>100</td> элементы).

Ответы на вопрос(2)

чтобы найти строки со значениями выше100 и добавитьstyle="color: #FF0000;" в строку, чтобы сделать текст красным.

Вы можете изменить regex + matchevaluator, если хотите, чтобы значение CPU было красным, добавив цветовой стиль к<td>-Tag для поля процессора.

Ex.

#Get HTML
$html = ps | select name, cpu, Handles, FileVersion | convertto-html

#Get headers
$headers = [regex]::Matches(($html | out-string), "<th>(.*?)</th>")
#Find index of CPU-header
$cpu = $headers | ForEach-Object -Begin { $i = 0 } -Process { if($_.Groups[1].Value -eq 'CPU') { $i } else { $i++ } }

#Regex Replace MatchEvaluator
$ME = {
    param($match)

    #If Group 2 (CPU) is greater than 100
    if([double]::Parse($match.Groups[2].Value) -gt 100) {
        #Add red text-style to row
        '<tr style="color: #FF0000;">{0}' -f $match.Groups[1].Value
    } else {
        #Return org. value
        $match.Value
    }

}

#Regex replace all lines
$body = $html | Foreach-Object { [regex]::Replace($_, "^<tr>((?:<td>[^<]*?<\/td>){$cpu}<td>(\d.*?)<\/td><.*)", $ME) }

Regex-demo @ Regex101

который я однажды сделал поздно вечером, играя с Powershell (примечание: код не оптимизирован, но его можно использовать как источник вдохновения, поскольку он делает именно то, что вам нужно). Этот образец был основан на Exchange CMDlets, где я хотел выделить почтовые ящики размером более XXX ГБ.

$MailboxStatisticsList = Get-Mailbox | Get-MailboxStatistics
$Report = foreach ($Mailbox in $MailboxStatisticsList)
    {
    $Split = $Mailbox.TotalItemSize.Split(" ")
    ## New way to get it right : we Regex the bytes and convert it to MB
    $MailboxItemSize = $($Split[2] -replace '[^0-9]') / 1MB
    [PSCustomObject] @{
        Mailbox = $Mailbox.DisplayName
        TotalItemSize = $MailboxItemSize -as [int]
        } ## END OF PSCUSTOMOBJECT
    } ## END OF FOREACH LOOP


$CSS = @'
<style>
body {
    font-size : 14px;
    font-family : arial;
    }

h2 {
    text-align: center;
    }

div.topbar {
    height : 50px;
    width : 100%;    
    background-color : darkred;
    }

table.mailboxsizetable {
    background-color : lightblue;
    border : 3px solid black;
    border-radius : 5px;
    box-shadow: 10px 10px 5px #888888;
    }

td {
    border : 2px solid black;
    border-radius : 5px;
    }

tr.tablerow {
    background-color : lightgreen;
    }

th {
    background-color : yellow;
    border : 3px solid black;
    border-radius : 5px;
    font-size : 16px;
}

td.toobig {
    background-color : red;
    color : green;
    }

div.tablediv table {
    margin : auto;
    }

td:hover {
    background-color : white;
    color : gold;
    font-weight : bold;
    }

</style>
'@

$BaseHTML = @'
<div class="topbar">
</div>
<h2>Service Report</h2>
'@

## Convert to HTML and export table to a variable
$HTMLTable = $Report | Sort-Object TotalItemSize -Descending | ConvertTo-Html -Fragment
## Import the HTML table as XML
[xml]$XML = $HTMLTable
## Create the attribute Class....
$TableClass = $XML.CreateAttribute("class")
## ....and give it the value "test"
$TableClass.Value = "mailboxsizetable"
## Now we stick it together and append it
$XML.table.Attributes.Append($TableClass)
## Outputting $XML.OuterXML returns the HTML with the class

## Now we take it 1 step further : conditional formatting for the table rows (on individual <td> is on my ToDo list)
## Foreach TR :
foreach ($TableRow in $XML.table.SelectNodes("tr"))
    {
    ## each TR becomes a member of class "tablerow"
    $TableRow.SetAttribute("class","tablerow")
    ## If row has TD and TD[1] has the state running...
    if (($TableRow.td) -and ([int]$TableRow.td[1] -gt 2000))
        {
        ## tag the TD with the class "notrunning" (should make this an Id)
        $TableRow.SelectNodes("td")[1].SetAttribute("class","toobig")
        }
    }
## Added code : enclose the table in a div tag
$FinalHTMLTable = [string]::Format('<div class="tablediv">{0}</div>',$XML.OuterXml)
ConvertTo-Html -Head $CSS -Body ($BaseHTML + $FinalHTMLTable) | Out-File C:\TempFolder\mailexport.html

Ваш ответ на вопрос