45

私は、パラメータを使用してコンソールアプリケーションをプログラムする方法を知っています。例:myProgram.exeparam1param2。

私の質問は、どうすればプログラムを|で動作させることができるかということです。例:echo "word" | myProgram.exe?

4

8 に答える 8

46

ユーザー入力を読んでいるかのようConsole.Read()に使用する必要があります。Console.ReadLine()パイプはユーザー入力を透過的に置き換えます。両方を簡単に使用することはできません(ただし、それはかなり可能だと確信しています...)。

編集:

シンプルなcatスタイルのプログラム:

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

    }
}

そして、実行すると、予想どおり、出力は次のようになります。

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

C:\ ... \ ConsoleApplication1 \ bin \ Debug>
于 2008-10-14T00:16:50.100 に答える
19

以下は、入力のためにアプリケーションを一時停止せず、データがパイプされているかどうかに関係なく機能します。ちょっとしたハック。エラーキャッチにより、多数のパイプ呼び出しが行われるとパフォーマンスが低下する可能性がありますが...簡単です。

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
}
于 2010-11-02T00:45:03.340 に答える
14

.NET 4.5では

if (Console.IsInputRedirected)
{
    using(stream s = Console.OpenStandardInput())
    {
        ...
于 2015-03-14T10:09:03.723 に答える
11

これはそれを行う方法です:

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

これにより、2 つの使用方法が可能になります。標準入力から読み取る:

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

またはパイプ入力から読み取る:

C:\test>echo hello | myProgram.exe
Data read was hello
于 2014-01-20T17:17:28.463 に答える
4

これは、他のソリューションと peek() を組み合わせた別の代替ソリューションです。

Peek() がないと、t.txt が複数行のファイルである "type t.txt | prog.exe" を実行するときに、最後に ctrl-c がないとアプリが返されないことがわかりました。しかし、「prog.exe」または「echo hi | prog.exe」だけで問題なく動作しました。

このコードは、パイプ入力のみを処理するためのものです。

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;
    }
}
于 2012-03-15T00:30:25.213 に答える
2

Console.In は、標準入力ストリームにラップされた TextReader への参照です。大量のデータをプログラムにパイプする場合、その方法で作業する方が簡単な場合があります。

于 2008-10-14T01:00:02.683 に答える
1

提供された例に問題があります。

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

プログラムがパイプされたデータなしで起動された場合、入力を待ってスタックします。そのため、ユーザーは手動で任意のキーを押してプログラムを終了する必要があります。

于 2010-01-28T00:52:13.753 に答える