Exécutez plusieurs lignes de commande avec le même processus en utilisant .NET

J’essaie d’exécuter plusieurs commandes sans créer un nouveau processus à chaque fois. Fondamentalement, je veux démarrer le shell de commandes DOS, passer au shell de commandes MySQL et exécuter une commande. Voici comment j’appelle la procédure (également ci-dessous). Comment puis-je gérer les “\” dans la commande?

ExecuteCommand("mysql --user=root --password=sa casemanager", 100, false); ExecuteCommand(@"\. " + Environment.CurrentDirectory + @"\MySQL\CaseManager.sql", 100, true); private void ExecuteCommand(ssortingng Command, int Timeout, Boolean closeProcess) { ProcessStartInfo ProcessInfo; Process Process; ProcessInfo = new ProcessStartInfo("cmd.exe", "/C " + Command); ProcessInfo.CreateNoWindow = false; ProcessInfo.UseShellExecute = false; Process = Process.Start(ProcessInfo); Process.WaitForExit(Timeout); if (closeProcess == true) { Process.Close(); } } 

Vous pouvez redirect une entrée standard et utiliser un StreamWriter pour y écrire:

  Process p = new Process(); ProcessStartInfo info = new ProcessStartInfo(); info.FileName = "cmd.exe"; info.RedirectStandardInput = true; info.UseShellExecute = false; p.StartInfo = info; p.Start(); using (StreamWriter sw = p.StandardInput) { if (sw.BaseStream.CanWrite) { sw.WriteLine("mysql -u root -p"); sw.WriteLine("mypassword"); sw.WriteLine("use mydb;"); } } 
 const ssortingng strCmdText = "/C command1&command2"; Process.Start("CMD.exe", strCmdText); 

Ne pourriez-vous pas simplement écrire toutes les commandes dans un fichier .cmd du dossier temp, puis exécuter ce fichier?

 ProcessStartInfo pStartInfo = new ProcessStartInfo(); pStartInfo.FileName = "CMD"; pStartInfo.Arguments = @"/C mysql --user=root --password=sa casemanager && \. " + Environment.CurrentDirectory + @"\MySQL\CaseManager.sql" pStartInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(pStartInfo); 

Le && est le moyen d’indiquer au shell de commandes qu’il existe une autre commande à exécuter.

Un processus de ligne de commande tel que cmd.exe ou mysql.exe lit généralement (et exécute) tout ce que vous (l’utilisateur) saisissez (au clavier).

Pour imiter cela, je pense que vous souhaitez utiliser la propriété RedirectStandardInput : http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput.aspx

Vous devez LIRE TOUTES les données depuis l’entrée, avant d’envoyer une autre commande!

Et vous ne pouvez pas demander à lire si aucune donnée n’est disponible … un petit peu ne l’est pas?

Mes solutions … quand demander de lire … demander de lire un gros tampon … comme 1 MEGA …

Et vous devrez attendre au moins 100 millisecondes … exemple de code …

 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim oProcess As New Process() Dim oStartInfo As New ProcessStartInfo("cmd.exe", "") oStartInfo.UseShellExecute = False oStartInfo.RedirectStandardOutput = True oStartInfo.RedirectStandardInput = True oStartInfo.CreateNoWindow = True oProcess.StartInfo = oStartInfo oProcess.Start() Dim Response As Ssortingng = Ssortingng.Empty Dim BuffSize As Integer = 1024 * 1024 Dim x As Char() = New Char(BuffSize - 1) {} Dim bytesRead As Integer = 0 oProcess.StandardInput.WriteLine("dir") Threading.Thread.Sleep(100) bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize) Response = Ssortingng.Concat(Response, Ssortingng.Join("", x).Subssortingng(0, bytesRead)) MsgBox(Response) Response = Ssortingng.Empty oProcess.StandardInput.WriteLine("dir c:\") Threading.Thread.Sleep(100) bytesRead = 0 bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize) Response = Ssortingng.Concat(Response, Ssortingng.Join("", x).Subssortingng(0, bytesRead)) MsgBox(Response) End Sub End Class 

Vous pouvez également demander à MySQL d’exécuter les commandes dans un fichier donné, comme ceci:

 mysql --user=root --password=sa casemanager < CaseManager.sql