Как раскрасить вывод 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.
Ответ 6
Вы можете установить модуль PsWrite
Запись цвета
![enter image description here]()
у него также есть другие умные функции, такие как
Написать-logstep
![enter image description here]()
Написать-ProgressbarreColor
![enter image description here]()