10 junho 2009

Captura da linha de comandos em visual basic .net

Foi necessário colocar um botão numa página web, para executar um programa em linha de comando. Pretende-se obter o resultado da execução desse programa.

Existem muitas versões por aí, para diferentes versões do visual basic, mas esta é a mais simples. Mesmo assim, foi necessário fazer algumas adaptações em relação ao código retirado da fonte que apresento no final.

Imports:

Imports System.Diagnostics


Código a colocar no button click:


Dim processamento As String
'colocar lista de argumentos
processamento = importarDados("")

'o replace é importante em determinadas situações
'processamento = processamento.Replace(" ", "\n")

'caso se queira apresentar o resultado na página web, é preferível utilizar o htmlencode
'processamento = Server.HtmlEncode(processamento)

'resposta na página ou numa caixa javascript alert
'Response.Write(processamento)
Response.Write("< script language='JavaScript' > alert('" & processamento & "')< /script >")


A caixa de alert pode não funcionar. Não existindo nenhum problema fora do normal, o erro será:
"Constante de cadeia não terminada" ou "Unterminated String constant"

Isto deve-se a algum caracter lido, que o alert não consegue representar. Deparei-me com esta situação, mas não consegui identificar esse caracter.


Função importarDados:


Public Function importarDados(ByVal valores As String) As String
'lê o resultado devolvido pela consola

Dim processoResultado As String
Dim processoInfo As New ProcessStartInfo
Dim Appsettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader
Dim programa As String
Dim processo As System.Diagnostics.Process

'caminho guardado em web.config
programa = CType(Appsettings.GetValue("", GetType(System.String)), String)
'programa = "c:\teste.bat"

Try
processoInfo.RedirectStandardOutput = True
processoInfo.UseShellExecute = False

processoInfo.FileName = programa.ToString
processoInfo.Arguments = valores.ToString
processoInfo.WindowStyle = Diagnostics.ProcessWindowStyle.Hidden

processo = System.Diagnostics.Process.Start(processoInfo)
'leitura
processoResultado = processo.StandardOutput.ReadToEnd()
'processoResultado = processo.StandardOutput.ReadLine()
processo.WaitForExit()
processo.Close()
Catch ex As Exception
processoResultado = ex.Message
End Try

Return processoResultado

End Function



Alterações ao web.config:


'colocar o impersonate a "true";
'definir a variável, com o caminho para o programa:
'< appSettings >< add key="" value="" / >< /appSettings >



Podem ainda existir mais algumas dificuldades, relacionadas com permissões.

Fonte:
http://forums.devx.com/showthread.php?t=142552

2 comentários:

Unknown disse...

Boas,
Se não for o nosso amigo GestRH não actualizavas o blog ;)
Continua o bom trabalho.

To disse...

É verdade... :D

Abraço.