La lecture et l'écriture à l'invite de commande de la console à l'aide de VB.net
J'ai posé une question similaire ailleurs, mais peut-être que je n'ai pas demander le droit chemin ou je n'ai pas été assez clair donc, je demande à nouveau.
C'est là que je veux obtenir:
- Ouvrez une invite de commande windows
- Exécuter une application DOS grâce à une commande dos
- Lire le texte retourné qui est indiqué dans le dos de la boîte et de l'afficher dans une zone de texte dans mon formulaire windows. Cette opération doit être répétée à intervalles réguliers (par exemple, à chaque seconde) et le dos de la boîte ne doit pas être fermée.
J'ai été tourner en rond en essayant d'utiliser les Processus et StartInfo commandes, mais ils seulement d'exécuter l'application et fermer immédiatement. J'ai besoin de garder le dos ouvert la boîte et continuez de lire un nouveau texte qui est ajouté par l'application de dos. Je suis aussi tombée sur ce fil qui semble répondre à mon problème, mais c'est en C# et je ne pouvais pas la convertir:
Lire l'Invite de commandes Windows STDOUT
Je l'ai fait entrer à la partie où j'ouvre l'invite de commande et d'obtenir le démarrage de l'application, mais je ne sais pas comment lire les données qu'il retourne sur le dos de la boîte de la console de chaque maintenant et puis. Je veux vérifier en permanence les changements de sorte que je peux agir sur eux, peut-être l'aide d'un contrôle timer.
S'il vous plaît aider.
Merci!
J'ai couru le code qui a été aimablement fourni par Stevedog et l'a utilisé comme ceci:
Private WithEvents _commandExecutor As New CommandExecutor()
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
_commandExecutor.Execute("c:\progra~2\zbar\bin\zbarcam.exe", "")
End Sub
Private Sub _commandExecutor_OutputRead(ByVal output As String) Handles _commandExecutor.OutputRead
txtResult.Text = output
End Sub
Mais tout ce que je reçois est vide dos de la boîte. Le zbarcam application s'exécute correctement, car je peux voir l'aperçu de l'appareil photo et je peux le voir également la détection de Codes QR, mais le texte n'est pas affiché dans la fenêtre dos et _commandExecutor_OutputRead
sous n'est pas déclenchée, sauf si je ferme la fenêtre DOS.
- Que l'extrait de code devrait être assez facile à convertir. Si vous ne pouvez pas le faire, il y a quelques utilitaires en ligne pour vous aider. Google c sharp pour vb conversion et il ya beaucoup d'options. Et si vous êtes un .net programmeur, vous devez être conscient que vous avez la possibilité d'utiliser le code de différentes langues dans la même solution.
- Grâce GrayFox374. Oui j'avais déjà essayé un C# pour VB.Net convertisseur mais j'obtenais une erreur à la ligne 1. J'ai aussi essayé de convertir le code manuellement (je suis un peu familier avec le C#) mais je ne pouvais pas convertir "proc.OutputDataReceived" depuis que la propriété ne semble pas exister (il n'a même pas venir avec intellisense).
- voir ma réponse pour une conversion à l'VB.Net
- Avez-vous besoin de votre programme à ramasser sur une fenêtre de console commencé d'ailleurs, ou est-il possible pour votre programme pour démarrer la console? Si ce dernier et si cela doit se produire à plusieurs reprises, est-il possible pour la console de fenêtre pour la fermer, si votre application peut tout simplement ré-ouvrir à nouveau?
- Oui, la console est ouverte par mon application, mais il ne peut pas être fermé et ouvert à de multiples reprises depuis l'application de DOS prend environ 20 secondes pour commencer à travailler. L'application en question est zbarcam, qui, après être invoquée dans le DOS, s'ouvre une autre fenêtre, avec un aperçu de ce que la webcam est de voir, et puis commencer à afficher le texte décodé des QR codes à l'intérieur de la première invite de commande de la boîte. J'ai besoin de lire le texte dans le dos, à intervalles réguliers, afin de vérifier tout nouveau QR codes détectés par la web cam.
- Veuillez préciser: êtes-vous en train de parler d'un DOS (c'est a dire 8 bits, 10 ans et+) de l'application? Ou avez-vous juste dire une application en ligne de commande? DOS les applications s'exécutent dans un environnement d'émulation qui peut compliquer les choses.
Vous devez vous connecter pour publier un commentaire.
Que C# exemple est mauvais car il ne montre pas comment en fait pour lire le flux de sortie standard. Créer une méthode comme ceci:
Ensuite, vous pouvez l'appeler comme ceci:
Bien sûr, cela rend un appel synchrone. Si vous voulez appeler la ligne de commande en mode asynchrone et juste soulever un événement quand il est complet, c'est possible aussi, mais aurait besoin d'un peu plus de codage.
Si vous voulez le faire de manière asynchrone et il suffit de garder un contrôle périodique pour plus de sortie sur un intervalle de temps fixe, par exemple, voici un exemple simple:
Ensuite, vous pouvez l'utiliser comme ceci:
Object reference not set to an instance of an object
sur la ligneDim output As String = _output.ReadToEnd()
. Et comment puis-je obtenir le résultat dans une zone de texte dans mon formulaire principal?System.NullReferenceException was unhandled by user code
Ces convertisseurs échouent en général quand il s'agit de manifestations.
Une traduction directe de ce code ressemblerait à:
proc.OutputDataReceived
n'est pas une propriété, mais un l'événement.De s'abonner à des événements, dans
C#
vous utilisezevent += handler
, tandis que dansVB.NET
vous utilisezAddHandler event, AddressOf handler
.InterProcOutputHandler
ne semble pas être le tir à chaque fois qu'un bon code est détecté. Je sens que je suis proche de la solution, mais je suis en manque probablement une seule ligne de code qui fait la différence!