Есть ли способ указать цвет шрифта при использовании записи-вывода
У меня есть powershell script, который дает некоторый статус вывода через write-output. Я намеренно не использую write-host, потому что вывод может быть записан и записан в файл журнала следующим образом:
./myscript.ps1 | out-file log.txt
Но если выход не перенаправлен, было бы неплохо иметь цветной вывод на консоли, потому что script создает множество разных сообщений о состоянии. Я знаю, что цветной вывод возможен с помощью записи-хоста, но сообщения о статусе должны быть доступными.
Есть идеи, как это решить?
Ответы
Ответ 1
Я пробовал эту дополнительную функцию, и она в основном работает нормально:
function Write-ColorOutput($ForegroundColor)
{
# save the current color
$fc = $host.UI.RawUI.ForegroundColor
# set the new color
$host.UI.RawUI.ForegroundColor = $ForegroundColor
# output
if ($args) {
Write-Output $args
}
else {
$input | Write-Output
}
# restore the original color
$host.UI.RawUI.ForegroundColor = $fc
}
# test
Write-ColorOutput red (ls)
Write-ColorOutput green (ls)
ls | Write-ColorOutput yellow
Результат этого конкретного теста немного забавен: мы действительно получаем линии в красном, зеленом и желтом цвете, но заголовок таблицы находится в красном цвете, т.е. цвет первого вызова функции.
Ответ 2
Отделите результаты по конвейеру от сообщений о статусе в консоли.
Например, используйте функцию, подобную этой в script:
function write-status( $status ){
$status | write-host -fore green -back red; #send a status msg to the console
$status | write-output; #send a status object down the pipe
}
Я также рекомендовал бы использовать один из следующих командлетов для write-host для вывода сообщений о статусе из ваших сценариев:
- write-debug
- write-error
- write-verbose
- записываемый предупреждение
Внешний вид этих сообщений о статусе будет зависеть от используемого командлета. Кроме того, пользователь может отключить определенные уровни статуса, используя переменные предпочтений $(предупреждение | ошибка | verbose | debug) или записать определенные сообщения о статусе, используя общие параметры командлета - (предупреждение | ошибка | verbose | debug).
Ответ 3
Я знаю, что этот пост древний, но это может пригодиться кому-то там.
Я хотел изменить цвета, и принятый ответ был не лучшим решением. На мой взгляд, следующий код является лучшим решением, поскольку он использует преимущества встроенной функциональности PowerShell:
EDIT:
# Print User message using String Array $message
function PrintMessageToUser {
param(
[Parameter( `
Mandatory=$True, `
Valuefrompipeline = $true)]
[String]$message
)
begin {
$window_private_data = (Get-Host).PrivateData;
# saving the original colors
$saved_background_color = $window_private_data.VerboseBackgroundColor
$saved_foreground_color = $window_private_data.VerboseForegroundColor
# setting the new colors
$window_private_data.VerboseBackgroundColor = 'Black';
$window_private_data.VerboseForegroundColor = 'Red';
}
process {
foreach ($Message in $Message) {
# Write-Host Considered Harmful - see http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/
# first way how to correctly write it
#Write-host $message;
Write-Verbose -Message $message -Verbose;
# second correct way how to write it
#$VerbosePreference = "Continue"
#Write-Verbose $Message;
}
}
end {
$window_private_data.VerboseBackgroundColor = $saved_background_color;
$window_private_data.VerboseForegroundColor = $saved_foreground_color;
}
} # end PrintMessageToUser