Войти

Показать полную графическую версию : [решено] как раскрасить html?


Ingolder
07-11-2009, 15:08
День добрый.
читаю методичку (хз откуда взятую) "Windows PowerShell Введение в технологии языка сценариев для пользователей без базовых знаний". (кому если надо - прикрепил)

Так вот, там есть пример они берут список служб и на его основе создают файл html и раскрашивают его в зависимости от состояния службы:

Get-Service | ConvertTo-Html -Property name,status | Foreach {
If ($_ -Like "*<td>Running</td>*") {$_ -Replace "<tr>", "<tr
bgcolor=green>"}
else {$_ -Replace "<tr>", "<tr bgcolor=red>"}} > .\get-service.html


Всё прекрасно работает, только отсюда возникает два вопроса.

1) почему неправильно работает, если мы уберём условие ELSE ? т.е. так:
Get-Service | ConvertTo-Html -Property name,status | Foreach {
If ($_ -Like "*<td>Running</td>*") {$_ -Replace "<tr>", "<tr
bgcolor=green>"}
} > .\get-service.html

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



2) как раскрасить список процессов таком образом, чтобы наиболее активные процессы отличались от менее активных? попытался сделать по аналогии, у меня не получается:

Get-Process|sort cpu -Des|convertto-html name, cpu | % {if ($_.cpu -gt 30){$_ -replace "<tr>", "<tr bgcolor=red>"}else{$_ -replace "<tr>",
"<tr bgcolor=green>"}}| out-file 1.html

всё зелёное выдаёт.
p.s. хочется здесь сделать по принципу "больше, чем", нежели по принципу "первые столько-то".


а вот и третий вопрос назрел:
3) как раскрасить ячейки в одной строке разным цветом?
(интересует повершельная сторона вопроса а не хтмл-ная)

amel27
07-11-2009, 19:07
1. без Else нельзя, т.к. в этом случае альтернативные варианты будут удаляться из потока... если их не нужно красить, можно сделать пустую замену или просто продублировать объект (строку)
Get-Service | ConvertTo-Html -Property name,status | Foreach {`
If ($_ -Like "*<td>Running</td>*") {$_ -Replace "<tr>", "<tr bgcolor=green>"}`
Else {$_}} > .\get-service1.html


2. ИМХО так сравнить не получится, т.к. на выходе имеем текстовые строки:
Get-Process | ConvertTo-Html Name,CPU | ForEach {`
[regex]::replace($_, "<tr>(?=<td>[^<]*</td><td>([3-9]\d,|\d{3}))","<tr bgcolor=red>")`
} >.\get-service2.html


3. аналогично п.2... про "повершельную сторону" не понял...
Get-Process | ConvertTo-Html Name,CPU | ForEach {`
[regex]::replace($_, "<td>(?=[^<]*</td></tr>)", "<td bgcolor=green>")`
} >.\get-service3.html

Ingolder
11-11-2009, 14:07
спасибо за ответ на первый вопрос!

коды под пунктами 2 и 3 выдают всё белое, ничего не раскрашивается..
и поясните их пожалуйста, мне во вторых строчках непонятно ничего.


про повершгельную сторону имел ввиду что я хтмл понимаю, неепонимаю именно как в повершелле правильно написать

amel27
12-11-2009, 10:51
коды под пунктами 2 и 3 выдают всё белое, ничего не раскрашивается..
и поясните их пожалуйста »

Собственно, 2 и 3 работают так же как 1: в итоговом HTML-файле производится построчная обработка текста - замена простых тегов на теги с заполненным атрибутом цета... только вместо простой замены подстроки (метод -Replace) используется замена на базе регулярных выражений (http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0 %BD%D0%B8%D1%8F). Чтобы было понятней, разделил опрерации формирования HTML (шаг 0.) и его последующего форматирования.

0. Формируем базовый HTML-документ (get-service0.html).
Get-Process | ConvertTo-Html Name,CPU >.\get-service0.html
1. Подсвечиваем красным CPU >=30 (get-service2.html).
Get-Content .\get-service0.html | ForEach {`
[regex]::replace($_,"<tr>(?=<td>[^<]*</td><td>([3-9]\d[.,]|\d{3}))","<tr bgcolor=red>")`
} >.\get-service2.html

2. Подсвечиваем зеленым весь второй столбец (get-service3.html).
Get-Content .\get-service0.html | ForEach {`
[regex]::replace($_,"<td>(?=[^<]*</td></tr>)","<td bgcolor=green>")`
} >.\get-service3.html

Xaegr
15-11-2009, 23:24
"Методичка" взята тут (http://blogs.technet.com/abeshkov/archive/2007/10/24/3018985.aspx), рядом лежит продолжение (http://blogs.technet.com/abeshkov/archive/2008/02/29/2943123.aspx).

Что касается вопросов... В данном случае IMHO проще и понятнее сформировать HTML самому, например так:
$Processes = Get-Process
$Max = ($Processes | sort cpu)[-1].cpu
$Mult = 255 / $max
$HtmlItems = ""
foreach ($P in $Processes)
{
$HtmlItems += ('<tr><td>{0}</td><td bgcolor="#FF{1:x2}{1:x2}">{2}</td></tr>' -f $P.Name, (255-([int]($P.CPU * $Mult))), $P.CPU)
}
$template = @"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML TABLE</title>
</head><body>
<table>
<colgroup>
<col/>
<col/>
</colgroup>
<tr><th>Name</th><th>CPU</th></tr>
$HtmlItems
</table>
</body></html>
"@
$template | set-content out.html

Этот скрипт подсветит колонку CPU. Яркость вычисляется относительно самого занятого процесса.




© OSzone.net 2001-2012