.NET Framework 4.5以降では、IsInputRedirected/IsOutputRedirected/IsErrorRedirectedの各プロパティを参照することにより、自プロセスの標準ストリームがリダイレクトされているかどうかを知ることができるようになっています。
これらのプロパティは、コマンドラインで標準ストリームのパイプ・リダイレクトを行った場合にtrueとなるほか、SetIn/SetOut/SetErrorメソッドによってリダイレクトを行った場合もtrueとなります。
標準ストリームがリダイレクトされているかどうかを調べる
using System;
class Sample {
static void Main()
{
// 各標準ストリームがリダイレクトされているかどうかを調べる
Console.WriteLine("IsInputRedirected: {0}", Console.IsInputRedirected);
Console.WriteLine("IsOutputRedirected: {0}", Console.IsOutputRedirected);
Console.WriteLine("IsErrorRedirected: {0}", Console.IsErrorRedirected);
}
}
実行結果
>sample.exe IsInputRedirected: False IsOutputRedirected: False IsErrorRedirected: False >type sample.txt | sample.exe IsInputRedirected: True IsOutputRedirected: False IsErrorRedirected: False >sample.exe | more IsInputRedirected: False IsOutputRedirected: True IsErrorRedirected: False >sample.exe < sample.txt IsInputRedirected: True IsOutputRedirected: False IsErrorRedirected: False >sample.exe > stdout.txt >type stdout.txt IsInputRedirected: False IsOutputRedirected: True IsErrorRedirected: False >test.exe 2> stderr.txt IsInputRedirected: False IsOutputRedirected: False IsErrorRedirected: True
これらのプロパティをチェックすることで標準出力の出力先がコンソールウィンドウかどうかを知ることができるため、リダイレクトされているときはConsole.ForegroundColor/BackgroundColorプロパティで文字色を変えたり、Console.CursorLeft/CursorTopプロパティでカーソルの位置を変えたりしないようにする、といったことができます。
.NET Framework 4.5より前のバージョンではこれらのプロパティは用意されないため、c# - How to detect if Console.In (stdin) has been redirected? - Stack Overflowで提示されているような方法を使って調べる必要があります。