A намного быстрее:
Хорошо, я продолжаю обещать себе, что больше не буду тратить время на решение проблем, но ... для того, чтобы оператор switch во втором ответе занял в моей системе более 10 секунд, - потому что он выполняет " где "вещи в PowerShell, а не в LINQ.
Поскольку PowerShell не поддерживает LINQ, я решил эту проблему, написав статический вспомогательный метод в вызове Add-Type (и ускорил этот оператор switch примерно в 1000 раз):
Add-Type -Language CSharpVersion3 -ReferencedAssemblies System.Xml, System.Xml.Linq -UsingNamespace System.Linq -Name XUtilities -Namespace Huddled -MemberDefinition @"
public static System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement> GetElementByIndex( System.Xml.Linq.XContainer doc, System.Xml.Linq.XName element, int index) {
return from e in doc.Descendants(element) where e.NodesBeforeSelf().Count() == index select e;
}
public static System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement> GetElementByValue( System.Xml.Linq.XContainer doc, System.Xml.Linq.XName element, string value) {
return from e in doc.Descendants(element) where e.Value == value select e;
}
"@
# Get the running processes to x(ht)ml
$xml = [System.Xml.Linq.XDocument]::Parse( "$(Get-Process | ConvertTo-Html)" )
# Find the index of the column you want to format:
$wsIndex = [Huddled.XUtilities]::GetElementByValue( $xml, "{http://www.w3.org/1999/xhtml}th", "WS" ) | %{ ($_.NodesBeforeSelf() | Measure).Count }
switch([Huddled.XUtilities]::GetElementByIndex( $xml, "{http://www.w3.org/1999/xhtml}td", $wsIndex )) {
{200MB -lt $_.Value } { $_.SetAttributeValue( "style", "background: red;"); continue }
{20MB -lt $_.Value } { $_.SetAttributeValue( "style", "background: orange;"); continue }
{10MB -lt $_.Value } { $_.SetAttributeValue( "style", "background: yellow;"); continue }
}
# Save the html out to a file
$xml.Save("$pwd/procs2.html")
# Open the thing in your browser to see what we've wrought
ii .\procs2.html
PowerShell 3:
Я переделал это в PowerShell 3 после того, как кто-то связался с этим постом, и вам больше не нужны скомпилированные типы, чтобы получить его быстро:
Add-Type -AssemblyName System.Xml.Linq
$Process = $(Get-Process | Select Handles, NPM, PM, WS, VM, CPU, Id, ProcessName)
$xml = [System.Xml.Linq.XDocument]::Parse( "$($Process | ConvertTo-Html)" )
if($Namespace = $xml.Root.Attribute("xmlns").Value) {
$Namespace = "{{{0}}}" -f $Namespace
}
# Find the index of the column you want to format:
$wsIndex = [Array]::IndexOf( $xml.Descendants("${Namespace}th").Value, "WS")
foreach($row in $xml.Descendants("${Namespace}tr")){
switch(@($row.Descendants("${Namespace}td"))[$wsIndex]) {
{200MB -lt $_.Value } { $_.SetAttributeValue( "style", "background: red;"); continue }
{20MB -lt $_.Value } { $_.SetAttributeValue( "style", "background: orange;"); continue }
{10MB -lt $_.Value } { $_.SetAttributeValue( "style", "background: yellow;"); continue }
}
}
# Save the html out to a file
$xml.Save("$pwd/procs1.html")
# Open the thing in your browser to see what we've wrought
ii .\procs2.html