Question

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

Ma question est la suivante: comment puis-je utiliser mon programme avec |, exemple: echo " mot " | monProgramme.exe?

Était-ce utile?

La solution

Vous devez utiliser Console.Read() et Console.ReadLine() comme si vous lisiez une entrée 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 de style cat simple:

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

    }
}

Et à l'exécution, comme prévu, la sortie:

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

C:\...\ConsoleApplication1\bin\Debug>

Autres conseils

Les éléments suivants ne suspendent pas l'application pour la saisie et fonctionnent lorsque les données ou ne sont pas acheminées. Un peu de bidouille; et, en raison de la capture d’erreurs, les performances risquent de faire défaut 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
}

dans .NET 4.5 c'est

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

C’est la manière 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);
    }
}

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

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

ou lisez à partir de entrée raccordée :

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

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

Sans le Peek (), je réalisais que l'application ne reviendrait pas sans ctrl-c à la fin lorsque vous ferez & "; tapez t.txt | prog.exe " où t.txt est un fichier multiligne. Mais juste & Quot; prog.exe & Quot; ou " echo hi | prog.exe " a bien fonctionné.

ce code est destiné à ne traiter que les entrées piped.

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 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 cette méthode.

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

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

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

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

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top