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

Я пытаюсь раскрасить ОЗУ столбца красным, если значение больше 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

Ответ 1

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

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

Ответ 2

Начиная с PowerShell 5.1 или более поздней версии, вы можете использовать escape-последовательности VT, чтобы добавить цвета в один столбец, но только если ваша консоль поддерживает VT escape (например, 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-последовательности.

Снимок экрана с выходным сигналом с цветными именами

Ответ 3

Принятый ответ неверен, возможно раскрасить столбцы. Решением для получения условных цветов столбцов является использование 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 хотели бы добавить в какой-то момент.

Ответ 4

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

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

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

Ответ 5

Это должен быть комментарий к ответу OptimusPrimus.

Обратите внимание, что для этого вы не можете использовать powershell_ise.