0

Mon application démarre périodiquement des programmes de console avec process.start. J'ai besoin de surveiller la sortie des programmes en "temps réel".Sortie de moniteur de processus standard qui n'utilise pas nécessairement CR/LF

Par exemple, le programme écrit le texte suivant à la console: traitement .................

Chaque seconde ou un nouveau point semble laisser l'utilisateur sait que le programme est en cours de traitement. Cependant, ... jusqu'à ce que le programme génère un CR/LF, je ne suis pas en mesure de récupérer la sortie standard du programme (alors qu'il est toujours en cours d'exécution).

Que puis-je faire pour obtenir la sortie en temps réel pour - disons - l'acheminer vers une base de données par exemple dans VB.NET?

Répondre

1

qu'en est-il de l'envoi de la sortie dans un fichier texte et de la lecture de ce fichier toutes les secondes?

+0

Malheureusement, je ne contrôle pas les applications de la console. En outre, à moins que l'application de console envoie un retour de chariot/saut de ligne (CRLF), je n'obtiens aucune donnée (ou est-ce que je fais quelque chose de mal?) – Mephisztoe

+1

@Tronex - si vous pouvez obtenir la sortie standard, vous pouvez la rediriger vers un fichier. Vous n'avez pas besoin de changer le programme lui-même, utilisez simplement l'opérateur ">" lorsque le programme est lancé pour rediriger la sortie vers un fichier. –

1

Je suis vidé parce que j'ai eu une application prototype à la maison qui a fait quelque chose comme ça. Je verrai si je peux aller le chercher. En attendant un coup d'oeil à ce lien:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

Il montre comment rediriger la sortie d'applications à un flux personnalisé par exemple

Public Class Form1 

    Private _p As Process 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

     Dim psi As New ProcessStartInfo() 

     psi.FileName = "C:\mydir.bat" 
     psi.RedirectStandardOutput = True 
     psi.UseShellExecute = False 

     _p = New Process() 
     _p.Start(psi) 
     tmrReadConsole.Enabled = True 
    End Sub 

    Private Sub tmrReadConsole_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrReadConsole.Tick 
     If _p IsNot Nothing Then 
      txtConsoleOutput.Text = _p.StandardOutput.ReadToEnd() 
     End If 

    End Sub 
End Class 

Ce qui précède est un formulaire en ligne qui a une minuterie qui est utilisé pour interroger le flux de sortie d'une console et d'obtenir son contenu dans une zone de texte. Cela ne fonctionne pas vraiment (d'où la raison pour laquelle je veux trouver mon autre application), mais vous avez l'idée.

Espérons que cela aide.

+0

Essayez ceci pour le bouton clic: Private Sub Button1_Click (expéditeur de ByVal comme System.Object, ByVal e comme System.EventArgs) Poignées Button1.Click _p = Nouveau processus _p.StartInfo.FileName = « C: \ mydir .bat » _p.StartInfo.RedirectStandardOutput = True _p.StartInfo.UseShellExecute = False _p.Start() txtConsoleOutput.Text = _p.StandardOutput.ReadToEnd End Sub –