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); } }