Back-End

1 mar, 2007

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

Publicidade

Olá pessoal, tudo bem? 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.

Vamos mostrar isto na prática. Capturaremos 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:

  • Um ListBox chamado lstSaidaDados
  • Um CheckBox chamado chkIncluirTudo e defina sua propriedade Text para : “Use “/Tudo” para obter todos os detalhes”
  • Um Button chamado btnAcionarProcesso. Defina sua propriedade Text para: Processar

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.

Exemplo:

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

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

Faça download do projeto completo aqui.

Até o próximo artigo!