C # Console Empfangseingang mit Rohr
Frage
Ich weiß, wie Konsolenanwendung mit Parametern zu programmieren. Beispiel: MyProgram.EXE param1 param2
Meine Frage ist, wie kann ich mein Programm machen arbeitet mit |, Beispiel: echo „Wort“ | MyProgram.EXE?
Lösung
Sie müssen Console.Read()
und Console.ReadLine()
verwenden, als ob Sie eine Benutzereingabe gelesen haben. Rohre ersetzen transparent Benutzereingaben. Sie können beide nicht leicht verwenden (obwohl ich bin sicher, es ist durchaus möglich, ...).
Edit:
Ein einfaches cat
Stil Programm:
class Program
{
static void Main(string[] args)
{
string s;
while ((s = Console.ReadLine()) != null)
{
Console.WriteLine(s);
}
}
}
Und wenn ausgeführt, wie erwartet, die Ausgabe:
C:\...\ConsoleApplication1\bin\Debug>echo "Foo bar baz" | ConsoleApplication1.exe "Foo bar baz" C:\...\ConsoleApplication1\bin\Debug>
Andere Tipps
Im Folgenden wird die Anwendung für die Eingabe nicht suspendieren und arbeitet, wenn Daten oder verrohrt nicht. Ein Bit einer Kerbe; und aufgrund der Fehler zu kontrollieren, die Leistung könnte fehlen, wenn zahlreiche verrohrt Anrufe gemacht, aber ... einfach.
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
}
in .NET 4.5 es ist
if (Console.IsInputRedirected)
{
using(stream s = Console.OpenStandardInput())
{
...
Dies ist der Weg, es zu tun:
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);
}
}
Auf diese Weise können zwei Verwendungsmethoden. Lesen von Standardeingabe :
C:\test>myProgram.exe
hello
Data read was hello
oder lesen von verrohrt Eingang :
C:\test>echo hello | myProgram.exe
Data read was hello
Hier ist eine andere alternative Lösung, die gemeinsam von den anderen Lösungen gestellt wurde sowie ein peek ().
Ohne die Peek () Ich war zu erfahren, dass der App nicht ohne ctrl-c am Ende zurückkehren würde, wenn dabei „Typ t.txt | prog.exe“, wo t.txt ist eine Multi-line-Datei. Aber nur "prog.exe" oder "echo hallo | prog.exe" hat gut funktioniert
.Dieser Code dient nur Prozess geleitet Eingang.
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 ist ein Verweis auf einen Textreader um den Standardeingabestrom eingewickelt. Wenn große Mengen von Daten zu Ihrem Programm kochend, könnte es einfacher sein, mit dieser Art und Weise zu arbeiten.
gibt es ein Problem mit dem mitgelieferten Beispiel.
while ((s = Console.ReadLine()) != null)
wird für die Eingabe stecken warten, wenn Programm ohne verrohrt Daten ins Leben gerufen wurde. so Benutzer muss manuell eine beliebige Taste drücken Programm zu beenden.
Dies funktioniert auch für
c: \ MyApp.exe
Ich hatte einen Stringbuilder zu verwenden, um die Eingaben von stdin eingefangen zu manipulieren:
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);
}
}