Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] как раскрасить html? (http://forum.oszone.net/showthread.php?t=156088)

Ingolder 07-11-2009 15:08 1263921

как раскрасить html?
 
Вложений: 1
День добрый.
читаю методичку (хз откуда взятую) "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 1264086

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 1267468

спасибо за ответ на первый вопрос!

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


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

amel27 12-11-2009 10:51 1268237

Цитата:

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

Собственно, 2 и 3 работают так же как 1: в итоговом HTML-файле производится построчная обработка текста - замена простых тегов на теги с заполненным атрибутом цета... только вместо простой замены подстроки (метод -Replace) используется замена на базе регулярных выражений. Чтобы было понятней, разделил опрерации формирования 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 1271303

"Методичка" взята тут, рядом лежит продолжение.

Что касается вопросов... В данном случае 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. Яркость вычисляется относительно самого занятого процесса.


Время: 01:57.

Время: 01:57.
© OSzone.net 2001-