using System; using System.Runtime.InteropServices; namespace RobvanderWoude { class IsRedirected { static int Main( string[] args ) { try { bool chkInput = false; bool chkOutput = false; bool chkError = false; // Check command line arguments (/I, /O and/or /E switches allowed) switch ( args.Length ) { case 0: chkInput = ConsoleEx.InputRedirected; chkOutput = ConsoleEx.OutputRedirected; chkError = ConsoleEx.ErrorRedirected; break; case 1: switch ( args[0].ToLower( ) ) { case "/i": case "-i": chkInput = ConsoleEx.InputRedirected; break; case "/o": case "-o": chkOutput = ConsoleEx.OutputRedirected; break; case "/e": case "-e": chkError = ConsoleEx.ErrorRedirected; break; case "/?": case "-?": case "/h": case "-h": case "/help": case "-help": // Display help text without error message throw new Exception( string.Empty ); default: throw new Exception( "Invalid command line argument" ); } break; default: // Display help text with error message throw new Exception( "Invalid command line arguments" ); } int result = 0; if ( chkInput ) { result += 2; } if ( chkOutput ) { result += 4; } if ( chkError ) { result += 8; } // Pass through any redirected StdIn if ( ConsoleEx.InputRedirected ) { string input = Console.In.ReadToEnd( ); Console.Write( input ); } // Return code 0..14 (even) return result; } catch ( Exception e ) { // Display help text with error message return WriteError( e ); } } // Code to detect redirection by Hans Passant on StackOverflow.com // http://stackoverflow.com/questions/3453220/how-to-detect-if-console-in-stdin-has-been-redirected public static class ConsoleEx { public static bool OutputRedirected { get { return FileType.Char != GetFileType( GetStdHandle( StdHandle.Stdout ) ); } } public static bool InputRedirected { get { return FileType.Char != GetFileType( GetStdHandle( StdHandle.Stdin ) ); } } public static bool ErrorRedirected { get { return FileType.Char != GetFileType( GetStdHandle( StdHandle.Stderr ) ); } } // P/Invoke: private enum FileType { Unknown, Disk, Char, Pipe }; private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 }; [DllImport( "kernel32.dll" )] private static extern FileType GetFileType( IntPtr hdl ); [DllImport( "kernel32.dll" )] private static extern IntPtr GetStdHandle( StdHandle std ); } // Code to display help and optional error message, by Bas van der Woude public static int WriteError( Exception e ) { return WriteError( e == null ? null : e.Message ); } public static int WriteError( string errorMessage ) { string fullpath = Environment.GetCommandLineArgs( ).GetValue( 0 ).ToString( ); string[] program = fullpath.Split( '\\' ); string exeName = program[program.GetUpperBound( 0 )]; exeName = exeName.Substring( 0, exeName.IndexOf( '.' ) ); Console.OpenStandardError( ); if ( string.IsNullOrEmpty( errorMessage ) == false ) { Console.WriteLine( ); Console.ForegroundColor = ConsoleColor.Red; Console.Write( "ERROR: " ); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine( errorMessage ); Console.ResetColor( ); } Console.WriteLine( ); Console.WriteLine( "IsRedirected, Version 1.00" ); Console.WriteLine( "Detect redirection of StdIn, StdOut and/or StdErr" ); Console.WriteLine( "(Standard Input, Standard Output and Standard Error respectively)" ); Console.WriteLine( ); Console.Write( "Usage: " ); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine( "{0} [ /I | /O | /E ]", exeName.ToUpper( ) ); Console.ResetColor( ); Console.WriteLine( ); Console.Write( "Where: " ); Console.ForegroundColor = ConsoleColor.White; Console.Write( "/I" ); Console.ResetColor( ); Console.Write( " returns result for Std" ); Console.ForegroundColor = ConsoleColor.White; Console.Write( "I" ); Console.ResetColor( ); Console.WriteLine( "n redirection only (default: all)" ); Console.ForegroundColor = ConsoleColor.White; Console.Write( " /O" ); Console.ResetColor( ); Console.Write( " returns result for Std" ); Console.ForegroundColor = ConsoleColor.White; Console.Write( "O" ); Console.ResetColor( ); Console.WriteLine( "ut redirection only" ); Console.ForegroundColor = ConsoleColor.White; Console.Write( " /E" ); Console.ResetColor( ); Console.Write( " returns result for Std" ); Console.ForegroundColor = ConsoleColor.White; Console.Write( "E" ); Console.ResetColor( ); Console.WriteLine( "rr redirection only" ); Console.WriteLine( ); Console.WriteLine( "Note: The result is returned as 'errorlevel', where" ); Console.WriteLine( " no redirection = 0, command line error = 1" ); Console.WriteLine( " redirected StdIn = +2, StdOut = +4, StdErr = +8" ); Console.WriteLine( ); Console.Write( "Check for redirection by Hans Passant on " ); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine( "StackOverflow.com" ); Console.WriteLine( "/questions/3453220/how-to-detect-if-console-in-stdin-has-been-redirected" ); Console.ResetColor( ); Console.WriteLine( ); Console.WriteLine( "Written by Rob van der Woude" ); Console.WriteLine( "http://www.robvanderwoude.com" ); Console.OpenStandardOutput( ); return 1; } } }