web-dev-qa-db-fra.com

La console C # reçoit une entrée avec un tuyau

Je sais comment programmer une application console avec des paramètres, par exemple: myProgram.exe param1 param2.

Ma question est, comment puis-je faire mon programme fonctionne avec |, exemple: echo "Word" | monProgramme.exe?

36
Patrick Desjardins

Vous devez utiliser Console.Read() et Console.ReadLine() comme si vous lisiez la saisie de l'utilisateur. Les tuyaux remplacent les entrées utilisateur de manière transparente. Vous ne pouvez pas utiliser les deux facilement (même si je suis sûr que c'est tout à fait possible ...).

Modifier:

Un programme simple de style cat:

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

    }
}

Et quand exécuté, comme prévu, la sortie:

 C:\...\ConsoleApplication1\bin\Debug> echo "Foo bar baz" | ConsoleApplication1.exe 
 "Foo bar baz" 
 [.________
43
Matthew Scharley

Les éléments suivants ne suspendent pas l'application pour la saisie et fonctionnent lorsque les données sont ou ne sont pas acheminées. Un peu de bidouille; et, en raison des erreurs d’erreur, les performances peuvent être insuffisantes lorsque de nombreux appels rediffusés sont effectués, mais… faciles.

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
}
15
CodeMiller

dans .NET 4.5 c'est

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

C'est la façon de le faire:

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

Cela permet deux méthodes d'utilisation. Lire à partir de entrée standard :

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

ou lire à partir de piped input :

C:\test>echo hello | myProgram.exe
Data read was hello
8
matt burns

Voici une autre solution alternative élaborée à partir des autres solutions plus un aperçu ().

Sans le Peek (), je me rendais compte que l'application ne reviendrait pas sans ctrl-c à la fin de l'opération "tapez t.txt | prog.exe", où t.txt est un fichier multiligne. Mais juste "prog.exe" ou "echo hi | prog.exe" a bien fonctionné.

ce code est destiné à traiter uniquement les entrées canalisées.

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;
    }
}
3
Matthew Benedict

Console.In est une référence à un TextReader enroulé autour du flux d'entrée standard. Lorsque vous transférez de grandes quantités de données dans votre programme, il peut être plus facile de travailler avec cela.

2
Joel Mueller

il y a un problème avec l'exemple fourni.

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

sera bloqué en attente de saisie si le programme a été lancé sans données canalisées. de sorte que l'utilisateur doit appuyer manuellement sur n'importe quelle touche pour quitter le programme.

1
Alex N

Cela fonctionnera également pour

c:\MyApp.exe <input.txt

J'ai dû utiliser un StringBuilder pour manipuler les entrées capturées dans Stdin:

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

    }
}
0
Si Zi