2011-01-10 7 views
11

ライト出力でステータス出力を与えるpowershellスクリプトがあります。私は意図的に書き込みホストを使用していない出力をキャプチャし、このようなログファイルに書き込むことができるので:ライト出力を使用するときにフォントの色を指定する方法はありますか

./myscript.ps1 | out-file log.txt 

しかし、出力がリダイレクトされていない場合は、コンソール出力を色付けしているといいだろう、スクリプトがさまざまなステータスメッセージを生成しているためです。色付き出力は書き込みホストで可能ですが、ステータスメッセージはパイプ可能である必要があります。

これを解決する方法はありますか?

+0

MSは '書き込みhost' http://technet.microsoftを使用することを提案しています。 com/en-us/library/ff406264.aspxしかし、私はあなたの心配を理解しています –

答えて

6

私はこの余分な機能を試してみましたが、それは基本的に正常に動作します:

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 

この特定のテストの結果がが少しおかしいです:私たちは本当に、赤、緑、黄色の線が、テーブルヘッダを取得しますすなわち、関数の最初の呼び出しの色です。

+3

これはISEや他のコンソールベースでないホストではうまく動作しません。 :-)代わりに '$ host.UI.RawUI.ForegroundColor'を試してみてください。 –

+1

@Keith、あなたは間違いなく(たとえ著者がコンソールについて質問しても)正しいです。私はコードを更新しました。 –

+2

[Console] :: ForegroundColorは、$ host.UI.RawUI.ForegroundColorがあなたがpowershell_iseで期待していることはしません**ので、実際にはより良いです。 – VoidStar

7

パイプライン上の結果をコンソールのステータスメッセージから区切ります。

例えば、あなたのスクリプトの中でこのような関数を使用します。

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 
} 

私はまた、あなたのスクリプトからステータスメッセージを出力するための書き込みホストに比べて次のコマンドレットのいずれかを使用をお勧めします:

  • 書き込みデバッグ
  • 書込みエラー
  • 書き込み冗長
  • 書き込み警告

これらのステータスメッセージの外観は、使用されるコマンドレットによって異なります。さらに、$(warning | error | verbose | debug)プリファレンス変数を使用して特定のレベルのステータスを無効にするか、 - (warning | error | verbose | debug)変数の共通コマンドレットパラメータを使用して特定のステータスメッセージを取得できます。

+2

出力がファイルにパイプされていないときは、すべてのメッセージが2度表示されるので、あまりうまくいかない。 – binford

+1

私が同意すると、これを使用する関数は対話的な使用には適していません。書き込みホストされたものをキャプチャするための唯一の良い方法は、Start-Transcriptです。 – VoidStar

0

私はこの投稿が古代であることを知っていますが、これはそこに誰かに便利になることができます。

私は色を変えたいと思っていました。答えは最高でした。それはネイティブ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 
関連する問題