Как раскрасить вывод PowerShell из Format-Table

Я пытаюсь раскрасить RAM столбца красным цветом, если значение больше 100 МБ:

Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
            @{ Label = "Name"; Expression={$_.Name}},
            @{ Label = "RAM (MB)"; Expression={[System.Math]::Round($_.WS/1MB, 1)}},
            @{ Label = "Responding"; Expression={$_.Responding}}

Enter image description here

Я пытаюсь с Write-Host-nonewline, но результат неправильный.

Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
            @{ Label = "Name"; Expression={$_.Name}},
            @{ Label = "RAM (MB)"; Expression={write-host -NoNewline $([System.Math]::Round($_.WS/1MB, 1)) -ForegroundColor red}},
            @{ Label = "Responding"; Expression={ write-host -NoNewline $_.Responding -fore red}}

Enter image description here

4 ответов


вы можете раскрасить строки использование регулярных выражений...

filter colorize-row{

    Get-Process | Select-Object Id, Name, WS, Responding | foreach {

        # Print 'red' row if WS greater than 100 MB
        if([System.Math]::Round($_.WS/1MB,1) -match "^([0-9]|[0-9][0-9]|[1-9][0-9]?$|^100$)$"){
            [console]::ForegroundColor="white"; $_;
        } else {
            [console]::ForegroundColor="red"; $_;
        }
    }
}

colorize-row

выход:

Enter image description here


начиная с PowerShell 5.1 или более поздней версии вы можете использовать VT escape-последовательности для добавления цветов в один столбец, но только если ваша консоль поддерживает escape-последовательности VT (например, Windows 10 Fall Creators Update, Linux или Mac, но не Windows 8 без эмулятора консоли, такого как ConEmu).

вот пример, который имеет форматирование, указанное в выражении, хотя то же самое можно использовать в файле ps1xml:

dir -Exclude *.xml $pshome | Format-Table Mode,@{
    Label = "Name"
    Expression =
    {
        switch ($_.Extension)
        {
            '.exe' { $color = "93"; break }
            '.ps1xml' { $color = '32'; break }
            '.dll' { $color = "35"; break }
           default { $color = "0" }
        }
        $e = [char]27
       "$e[${color}m$($_.Name)${e}[0m"
    }
 },Length

и полученный результат, обратите внимание, что ширина столбца выглядит хорошо, нет дополнительных пробелов из символов escape-последовательности.

Screenshot of dir output with colored names


принятый ответ неверен,можно раскрасить столбцы. Решение для получения условных цветов столбцов-использовать Write-PSObject.

вот несколько замечательных примеров с документированным кодом и пояснениями.

из вышеуказанного ресурса:

Write-PSObject $servers -MatchMethod Exact -Column "Manufacture" -Value "HP" -ValueForeColor Yellow -ValueBackColor Red -RowForeColor White -RowBackColor Blue;

enter image description here

Я нашел это через проблема GitHub для добавления цветового форматирования в Format-Table, который, кажется, в какой-то момент разработчики PowerShell хотели бы добавить функцию.


быстрый ответ заключается в том, что вы не можете. Можно использовать Write-Host С цветами, но нет "вывода" для отправки в format-table.

"вывод" из Write-Host-это побочный эффект, который отправляет данные непосредственно в консоль, а не возвращает их вызывающему объекту как стандартную функцию.

в сочетании с комментарием @David Martin, вот ссылка с интересной картиной-соответствуя функцией формат-цвета.