Pregunta

Sé cómo el programa de aplicación de Consola con los parámetros, por ejemplo :myProgram.exe param1 param2.

Mi pregunta es, ¿cómo puedo hacer que mi programa funciona con |, por ejemplo :echo "la palabra" | myProgram.exe?

¿Fue útil?

Solución

Usted necesidad de utilizar Console.Read() y Console.ReadLine() como si estuviera leyendo la entrada del usuario.Tubos de reemplazar la entrada del usuario de forma transparente.Usted no puede utilizar fácilmente (aunque estoy seguro de que es muy posible...).

Editar:

Un simple cat programa del estilo:

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

    }
}

Y cuando se ejecuta, como se esperaba, la salida de:

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

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

Otros consejos

Lo siguiente no suspenderá la solicitud de entrada y funciona cuando los datos son o no se canalizan. Un poco hack; y debido a la captura de errores, el rendimiento podría faltar cuando se realizan numerosas llamadas canalizadas pero ... fácil.

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
}

en .NET 4.5 es

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

Esta es la forma de hacerlo:

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

Esto permite dos métodos de uso. Leer desde entrada estándar :

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

o leer desde entrada canalizada :

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

Aquí hay otra solución alternativa que se creó a partir de las otras soluciones más un vistazo ().

Sin el Peek () estaba experimentando que la aplicación no volvería sin ctrl-c al final al hacer " escriba t.txt | prog.exe " donde t.txt es un archivo de varias líneas. Pero solo & Quot; prog.exe & Quot; o " echo hola | prog.exe " funcionó bien.

este código está destinado a procesar solo la entrada canalizada.

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 es una referencia a un TextReader envuelto alrededor de la secuencia de entrada estándar. Al canalizar grandes cantidades de datos a su programa, podría ser más fácil trabajar de esa manera.

hay un problema con el ejemplo proporcionado.

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

quedará atascado esperando la entrada si el programa se inició sin datos canalizados. por lo que el usuario debe presionar manualmente cualquier tecla para salir del programa.

Esto también funcionará para

  

c: \ MyApp.exe < input.txt

Tuve que usar un StringBuilder para manipular las entradas capturadas desde 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);

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top