Есть ли способ указать цвет шрифта при использовании записи-вывода

У меня есть 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