C# - Capturando a entrada padrão da aplicação


 Hoje veremos como capturar a entrada padrão e executar comandos de forma automatizada em uma aplicação C#.

Vamos supor que você deseja automatizar uma aplicação C#, e precisa dirigir a aplicação cmd.exe para exibir a  data e a hora atual (poderia ser qualquer outra tarefa como exibir a data atual, etc.).

Para fazer isso você abriria um prompt de comandos e digitaria: date /T e time /T na linha de comando :

Mas você deseja automatizar esse processo capturando a entrada padrão e emtir o comando via código que seria executado via processo no fluxo da aplicação.

Como você poderia fazer isso ?

Uma forma de fazer isso é iniciar um processo que fica monitorando a entrada de dados no fluxo de entrada padrão. Isso pode ser feito pela propriedade StartInfo da classe Process a qual é uma instância da classe ProcessStartInfo.

A propriedade StartInfo possui campos que controlam muitos detalhes do ambiente no qual o novo processo será executado, e, o método Process.Start irá iniciar o novo processo usando estas opções.

A primeira coisa a fazer é verificar se a propriedade StartInfo.RedirectStandardInput esta definida como true pois essa configuração notifica o processo que deve ler a partir da entrada padrão.

A seguir precisamos definir a propriedade StartInfo.UseShellExecute para false, porque se você fosse deixar o shell
lançar o processo para você, isso impediria que você redirecionasse a entrada padrão.

Feito isso, basta iniciar o processo e gravar no seu fluxo de entrada padrão.

Então vamos ver isso funcionando...

recursos usados:

  • Visual Studio 2017 Community

Criando o projeto Console

Crie um projeto do tipo Console App(.NET Framework) com o nome ModoConsole.

A seguir inclua o código abaixo no arquivo Program.cs :

using System;
using System.Diagnostics;
using System.IO;
namespace ModoConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            ExecutarProcessoParaLerEntradaPadrao();
            Console.ReadLine();
        }
        public static void ExecutarProcessoParaLerEntradaPadrao()
        {
            Process application = new Process();
            // Executa o comando shell.
            application.StartInfo.FileName = @"cmd.exe";
            // Ativa as extensões de command para cmd.exe.
            application.StartInfo.Arguments = "/E:ON";
            application.StartInfo.RedirectStandardInput = true;
            application.StartInfo.UseShellExecute = false;
            application.Start();
            StreamWriter input = application.StandardInput;
            // exibe o texto
            input.WriteLine("@Echo Exibindo a data");
            // Executa o comando e exibe a hora
            input.WriteLine("DATE /T");
            // exibe o texto
            input.WriteLine("@Echo Exibindo hora");
            // Executa o comando e exibe a hora
            input.WriteLine("TIME /T");
            // Para a aplicação iniciada
            input.WriteLine("exit");
        }
    }
}
 

Executando este código teremos o resultado abaixo:

Dessa forma redirecionar o fluxo de entrada para um processo permite que você interaja via código com certos aplicativos e utilitários que, de outra forma, você não seria capaz de automatizar sem ferramentas adicionais.

Depois que a entrada for redirecionada, você pode escrever o fluxo de entrada padrão do processo lendo  a propriedade Process.StandardInput , que retorna um StreamWriter.

Depois de fazer isso, você pode enviar comandos para o processo via chamadas WriteLine.

Para usar a StandardInput, você precisa especificar o valor true para a propriedade RedirectStandardInput caso contrário ao ler a propriedade StandardInput será lançada uma exceção.

Quando o valor de UseShellExecute for false, você pode usar Process apenas para criar processos executáveis.

Normalmente você pode usar a classe Process para executar operações no arquivo, como imprimir um documento do Microsoft Word, etc.

Outra diferença quando a propriedade UseShellExecute é definida com o valor false é que o diretório de trabalho não é usado para encontrar o executável, então você deve estar atento para passar um caminho completo ou ter o executável em seu ambiente PATH.

Pegue o projeto completo aqui :  ModoConsole.zip

"Não quero, porém, irmãos, que sejais ignorantes acerca dos que já dormem, para que não vos entristeçais, como os demais, que não têm esperança.
Porque, se cremos que Jesus morreu e ressuscitou, assim também aos que em Jesus dormem, Deus os tornará a trazer com ele."

1 Tessalonicenses 4:13,14

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

Referências:


José Carlos Macoratti