Ich weiß, wie man eine Konsolenanwendung mit Parametern programmiert, Beispiel: meinProgramm.exe param1 param2.
Meine Frage ist, wie kann ich mein Programm funktioniert mit |, Beispiel: echo "Wort" | myProgram.exe?
Ich weiß, wie man eine Konsolenanwendung mit Parametern programmiert, Beispiel: meinProgramm.exe param1 param2.
Meine Frage ist, wie kann ich mein Programm funktioniert mit |, Beispiel: echo "Wort" | myProgram.exe?
Sie müssen Folgendes verwenden Console.Read()
et Console.ReadLine()
als ob Sie Benutzereingaben lesen würden. Pipes ersetzen Benutzereingaben auf transparente Weise. Sie können nicht einfach beides verwenden (obwohl ich sicher bin, dass es durchaus möglich ist...).
Bearbeiten:
Eine einfache cat
Stilprogramm:
class Program
{
static void Main(string[] args)
{
string s;
while ((s = Console.ReadLine()) != null)
{
Console.WriteLine(s);
}
}
}
Und bei der Ausführung wird erwartungsgemäß die Ausgabe:
C:\\...\\ConsoleApplication1\\bin\\Debug>echo "Foo bar baz" | ConsoleApplication1.exe
"Foo bar baz"
C:\\...\\ConsoleApplication1\\bin\\Debug>
Funktioniert Ihr Beispiel für: echo "Foo bar baz" | ConsoleApplication1.exe | ConsoleApplication1.exe ?
Ja. Um eine Analogie auf niedrigerer Ebene zu verwenden: Was bei einer Pipe wirklich passiert, ist, dass der Stdout-Stream der ersten Anwendung mit dem Stdin-Stream der nächsten Anwendung in der Pipeline verbunden wird. Die stdin der Konsole wird durch die erste Anwendung geleitet, und die stdout der letzten Anwendung wird angezeigt.
Im Folgenden wird die Anwendung nicht für die Eingabe angehalten und funktioniert, wenn Daten oder ist nicht verrohrt. Ein bisschen ein Hack; und aufgrund der Fehlerabfangung, könnte die Leistung fehlen, wenn zahlreiche piped Anrufe gemacht werden, 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
}
Die antwort hier von hans passant stackoverflow.com/questions/3453220/ kurz vor dem Ende wird eine noch bessere Möglichkeit genannt System.Console.WriteLine(System.Console.IsInputRedirected.ToString());
Dies ist der richtige Weg:
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);
}
}
Dies ermöglicht zwei Verwendungsarten. Lesen von Standardeingabe :
C:\test>myProgram.exe
hello
Data read was hello
oder lesen von leitungsgebundener Eingang :
C:\test>echo hello | myProgram.exe
Data read was hello
Hier ist eine weitere alternative Lösung, die aus den anderen Lösungen und einem Peek() zusammengesetzt wurde.
Ohne Peek() habe ich die Erfahrung gemacht, dass die Anwendung ohne ctrl-c am Ende nicht zurückkehrt, wenn ich "type t.txt | prog.exe" eingebe, wobei t.txt eine mehrzeilige Datei ist. Aber nur "prog.exe" oder "echo hi | prog.exe" funktionierte gut.
dieser Code ist nur für die Verarbeitung von Eingaben in der Leitung gedacht.
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;
}
}
Die antwort hier von hans passant stackoverflow.com/questions/3453220/ kurz vor dem Ende wird eine noch bessere Möglichkeit genannt System.Console.WriteLine(System.Console.IsInputRedirected.ToString());
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.