La console C # reçoit une entrée avec un tuyau

Je sais comment programmer une application console avec des parameters, par exemple: myProgram.exe param1 param2.

Ma question est, comment puis-je faire mon programme fonctionne avec |, exemple: echo “mot” | monProgramme.exe?

Vous devez utiliser Console.Read() et Console.ReadLine() comme si vous lisiez l’entrée utilisateur. Les tuyaux remplacent les entrées utilisateur de manière transparente. Vous ne pouvez pas utiliser les deux facilement (même si je suis sûr que c’est tout à fait possible …).

Modifier:

Un programme de style cat simple:

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

Et quand exécuté, comme prévu, le résultat:

 C: \ ... \ ConsoleApplication1 \ bin \ Debug> echo "Foo bar baz" |  ConsoleApplication1.exe
 "Foo bar baz"

 C: \ ... \ ConsoleApplication1 \ bin \ Debug>

Les éléments suivants ne suspendent pas l’application pour la saisie et fonctionnent lorsque les données sont ou non acheminées. Un peu de bidouille; et, en raison des erreurs d’erreur, les performances peuvent être insuffisantes lorsque de nombreux appels rediffusés sont effectués, mais… faciles.

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

dans .NET 4.5 c’est

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

C’est la façon de le faire:

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

Cela permet deux méthodes d’utilisation. Lire à partir de l’entrée standard :

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

ou lire depuis une entrée canalisée :

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

Voici une autre solution alternative élaborée à partir des autres solutions, plus un aperçu ().

Sans Peek (), je réalisais que l’application ne reviendrait pas sans ctrl-c à la fin lorsque vous feriez “taper t.txt | prog.exe” où t.txt est un fichier multiligne. Mais juste “prog.exe” ou “echo hi | prog.exe” a bien fonctionné.

ce code est destiné à traiter uniquement les entrées canalisées.

 static int Main(ssortingng[] args) { // if nothing is being piped in, then exit if (!IsPipedInput()) return 0; while (Console.In.Peek() != -1) { ssortingng 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 est une référence à un TextReader enroulé autour du stream d’entrée standard. Lorsque vous transférez de grandes quantités de données dans votre programme, il peut être plus facile de travailler avec cette méthode.

il y a un problème avec l’exemple fourni.

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

sera bloqué en attente de saisie si le programme a été lancé sans données canalisées. l’utilisateur doit donc appuyer manuellement sur n’importe quelle touche pour quitter le programme.

Cela fonctionnera également pour

c: \ MyApp.exe

J’ai dû utiliser un SsortingngBuilder pour manipuler les entrées capturées dans Stdin:

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