VB 2005 - Capturando a saída de uma aplicação Console


Como capturar o resultado do processamento de uma aplicação console em sua aplicação Windows no VB 2005 Express ?

Boa pergunta , garoto !!!

Para poder realizar esta tarefa você deve usar a propriedade StartInfo da classe Process para redirecionar a saída de uma aplicação console para o seu código. A saída redirecionada irá aparecer como sendo um objeto StreamReader padrão , dai em diante você realizar o tratamento padrão.

Um componente Process fornece acesso ao processo que esta sendo executado em um computador. Uma thread é a unidade básica na qual o sistema operacional aloca o tempo de processamento e pode executar qualquer parte de código de um processo, incluindo partes que estão sendo executadas por outra thread.

O componente Process é uma ferramenta útil para iniciar, parar, controlar e monitorar aplicações, e, através dele você pode obter uma lista dos processos que estão rodando ou pode também iniciar um novo processo.

Nota: Veja mais detalhes sobre o uso do Process no artigo: VB.NET - Usando a classe System.Diagnostic.Proceess

Vamos mostrar isto na prática. Vamos capturar a saída do processamento da execução do comando ipconfig.exe.

O comando ipconfig mostra as configurações de rede da sua máquina local fornecendo informações como ip, mascara de rede , etc.

Abra o Visual Basic 2005 Express e crie uma nova aplicação do tipo Windows Forms chamada saidaConsole.

No formulário padrão form1.vb inclua os seguintes controles:

O leiaute final do formulário do projeto deverá ser igual ao da figura abaixo:

Inclua o seguinte código no evento Click do botão de comando :

Private Sub btnAcionarProcesso_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAcionarProcesso.Click
' ----- Carrega a saida do comando ipconfig.exe para o controle ListBox.
Dim ipConfig As Process
Dim umaLinha As String
Dim linhaPartes() As String

' ----- Remove qualquer item existente na listbox
lstSaidaDados.Items.Clear()

' ----- Constroi e executa o comando
ipConfig = New Process()
ipConfig.StartInfo.FileName = "ipconfig.exe"

'verifica se vai exibir todos os detalhes
If (chkIncluirTudo.Checked = True) Then ipConfig.StartInfo.Arguments = "/All"

'inicia o processo

ipConfig.StartInfo.UseShellExecute = False
ipConfig.StartInfo.RedirectStandardOutput = True
ipConfig.StartInfo.CreateNoWindow = True
ipConfig.Start()

' ----- Processa cada linha de entrada
Do While Not ipConfig.StandardOutput.EndOfStream
   ' ----- Ignora linhas em branco.
     umaLinha = ipConfig.StandardOutput.ReadLine()

     If (Trim(umaLinha) = "") Then Continue Do

    ' ----- Cabeçalho não possui espaços em branco
     If (umaLinha = umaLinha.TrimStart) Or (InStr(umaLinha, ":") = 0) Then
         lstSaidaDados.Items.Add(umaLinha.Trim)
    Else
       ' ----- Uma linha de detalhe. O formato é:
       ' Titulo … : Dados

       linhaPartes = umaLinha.Trim.Split(":"c)
       linhaPartes(0) = Replace(linhaPartes(0), ". ", "")
       linhaPartes(1) = linhaPartes(1).Trim
       lstSaidaDados.Items.Add(vbTab & linhaPartes(0) & ":" & linhaPartes(1))
    End If
Loop

ipConfig.WaitForExit()
ipConfig.Dispose()

End Sub

Executando o projeto e marcando a opção para exibir todos os detalhes o resultado obtido pode ser visto na figura abaixo:

Alguns programas de linha de comando , como dir.exe , não são realmente programas, mas comandos embutidos no processador Command. Para estes programas você vai precisar usar a instrução cmd.exe para o processo filename e passar o comando atual como um argumento com a opção /c.

Ex:

	ipConfig.StartInfo.FileName = "cmd.exe"
	ipConfig.StartInfo.Arguments = "/c dir c:\temp"

Nestes casos não como evitar que a janela de comando Dos aparecer momentaneamente durante o processamento do programa cmd.exe.

Pegue o projeto completo aqui: saidaConsole.zip

Até o próximo artigo .NET...


José Carlos Macoratti