J'essaie d'obtenir les résultats de n'importe quelle application DOS, en laissant effectivement C# fonctionner comme s'il s'agissait d'un utilisateur.Application de style cmd.exe écrite en C#
Je peux l'obtenir pour exécuter une commande, puis afficher la sortie. Le problème est de savoir quand la sortie est terminée! Par exemple, si je vais démarrer/lancer "cmd.exe", tapez "D:", puis "cd D: \", puis "arbre", il affiche ma structure de dossiers sur le lecteur D, puis me permet de tapez ma commande suivante (seulement après il est fini d'imprimer la liste).
Cependant, je n'arrive pas à trouver un moyen de le faire réaliser que c'est fini, et devrait permettre la commande suivante (essentiellement lorsque cmd.exe commence à clignoter votre curseur).
public Process p = null;
private void Form1_Load(object sender, System.EventArgs e)
{
ProcessStartInfo procStarter = new ProcessStartInfo("cmd.exe");
procStarter.RedirectStandardOutput = true;
procStarter.RedirectStandardInput = true;
procStarter.UseShellExecute = false;
procStarter.CreateNoWindow = true;
p = Process.Start(procStarter);
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
p.Close();
}
private void btnSend_Click(object sender, System.EventArgs e)
{
p.StandardInput.WriteLine("D:");
p.StandardInput.WriteLine(@"cd D:\");
txtOutput.Text = SendCommand(txtInput.Text);
}
private string SendCommand(string cmd)
{
p.StandardInput.WriteLine(cmd);
return p.StandardOutput.ReadToEnd();
}
Dans sendCommand (string cmd), si je lance p.StandardOutput.ReadToEnd(), selon le code ci-dessus, il se bloque toujours, en attendant sans doute pour l'application de fermer?
Si je boucle à travers p.StandardOutput.ReadLine(), il montre tout le texte (y compris le "D: \>" juste avant où le curseur clignotant serait alors, mais il ne réalise pas que c'est la fin, appelle ReadLine à nouveau, et se bloque à ReadToEnd.Une solution de contournement sale serait de traiter comme la fin de la réponse si la ligne en cours se termine par ">", mais qui se décompose si une ligne se termine comme ça n'importe où dans le réponse.
J'ai essayé une boucle à travers le caractère de flux par caractère, et il n'y a pas de caractère spécial envoyé à la fin.
des idées?
Note: Mon but ultime est de fournir une bibliothèque de lumière que je peux utiliser pour exécuter n'importe quel exécutable DOS (qui peut nécessiter plusieurs commandes tapées, pas seulement les commandes passées en ligne de commande à l'ouverture), analyser les résultats retournés avec un modèle regex et renvoyant le résultat extrait. J'ai pensé que si je peux effectivement ré-implémenter le cmd.exe dans une application Windows, alors une telle bibliothèque sera possible.
Merci, Lee
Ecrire un fichier de commandes, exécutez. –