C#控制台接收pipe道input

我知道如何编程控制台应用程序的参数,例如:myProgram.exe param1 param2。

我的问题是,我怎样才能使我的程序与| |例如:echo“word”| myProgram.exe?

您需要像使用用户input一样使用Console.Read()Console.ReadLine() 。 pipe道透明地replace用户input。 你不能轻易使用(尽pipe我确定这很可能…)。

编辑:

一个简单的cat式程序:

 class Program { static void Main(string[] args) { string s; while ((s = Console.ReadLine()) != null) { Console.WriteLine(s); } } } 

如预期的那样运行时,输出:

 C:\ ... \ ConsoleApplication1 \ bin \ Debug> echo“Foo bar baz”|  ConsoleApplication1.exe中
 “Foo bar baz”

 C:\ ... \ ConsoleApplication1 \ BIN \debugging>

以下不会暂停input应用程序,并在数据处于或未处理状态时工作。 有点破解; 并由于错误捕捉,性能可能缺乏时,许多pipe道调用,但…容易。

 public static void Main(String[] args) { String pipedText = ""; bool isKeyAvailable; try { isKeyAvailable = System.Console.KeyAvailable; } catch (InvalidOperationException expected) { pipedText = System.Console.In.ReadToEnd(); } //do something with pipedText or the args } 

在.NET 4.5中

 if (Console.IsInputRedirected) { using(stream s = Console.OpenStandardInput()) { ... 

这是做到这一点的方法:

 static void Main(string[] args) { Console.SetIn(new StreamReader(Console.OpenStandardInput(8192))); // This will allow input >256 chars while (Console.In.Peek() != -1) { string input = Console.In.ReadLine(); Console.WriteLine("Data read was " + input); } } 

这允许两种使用方法。 从标准input读取:

 C:\test>myProgram.exe hello Data read was hello 

或从pipe道input读取:

 C:\test>echo hello | myProgram.exe Data read was hello 

这是另一个解决scheme,从其他解决scheme加上一个peek()。

没有Peek()我正在经历,应用程序不会返回没有ctrl-c在做“t.txt | prog.exe”时,其中t.txt是一个多行文件。 但只是“prog.exe”或“echo hi | prog.exe”工作正常。

此代码仅用于处理pipe道input。

 static int Main(string[] args) { // if nothing is being piped in, then exit if (!IsPipedInput()) return 0; while (Console.In.Peek() != -1) { string input = Console.In.ReadLine(); Console.WriteLine(input); } return 0; } private static bool IsPipedInput() { try { bool isKey = Console.KeyAvailable; return false; } catch { return true; } } 

Console.In是对包装在标准inputstream中的TextReader的引用。 将大量数据传输到程序时,使用这种方式可能会更容易。

提供的示例存在问题。

  while ((s = Console.ReadLine()) != null) 

如果程序在没有pipe道数据的情况下启动,将等待input。 所以用户必须手动按任意键退出程序。

这也适用于

c:\ MyApp.exe <input.txt

我不得不使用一个StringBuilder来操纵从Stdin捕获的input:

 public static void Main() { List<string> salesLines = new List<string>(); Console.InputEncoding = Encoding.UTF8; using (StreamReader reader = new StreamReader(Console.OpenStandardInput(), Console.InputEncoding)) { string stdin; do { StringBuilder stdinBuilder = new StringBuilder(); stdin = reader.ReadLine(); stdinBuilder.Append(stdin); var lineIn = stdin; if (stdinBuilder.ToString().Trim() != "") { salesLines.Add(stdinBuilder.ToString().Trim()); } } while (stdin != null); } }