48 Stimmen

C# Konsole empfangen Eingabe mit Pipe

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?

52voto

Matthew Scharley Punkte 121038

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>

1 Stimmen

Funktioniert Ihr Beispiel für: echo "Foo bar baz" | ConsoleApplication1.exe | ConsoleApplication1.exe ?

3 Stimmen

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.

1 Stimmen

Wenn Sie mit binären Daten arbeiten: stackoverflow.com/questions/1562417/

20voto

CodeMiller Punkte 246

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
}

1 Stimmen

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.To‌​String());

16voto

gordy Punkte 8750

In .NET 4.5 heißt es

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

0 Stimmen

Hallo, ich kann nicht scheinen, um es mit diesem Code zu arbeiten, irgendwelche Ideen?

10voto

matt burns Punkte 23443

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

4voto

Matthew Benedict Punkte 1061

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

2 Stimmen

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.To‌​String());

CodeJaeger.com

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.

Powered by:

X