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?

War es hilfreich?

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

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top