为了账号安全,请及时绑定邮箱和手机立即绑定

使用.NET以相同的过程执行多个命令行

/ 猿问

使用.NET以相同的过程执行多个命令行

慕后森 2019-09-21 14:52:45

我试图执行多个命令而不每次都创建新进程。基本上,我想启动DOS命令外壳,切换到MySQL命令外壳,然后执行命令。这是我调用该过程的方式(也在下面)。另外,如何处理命令中的“ \”?


ExecuteCommand("mysql --user=root --password=sa casemanager", 100, false);


ExecuteCommand(@"\. " + Environment.CurrentDirectory + @"\MySQL\CaseManager.sql", 100, true);


private void ExecuteCommand(string 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(); }

}


查看完整描述

3 回答

?
万千封印

您可以重定向标准输入并使用StreamWriter对其进行写入:


        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;");

            }

        }


查看完整回答
反对 回复 2019-09-21
?
吃鸡游戏

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);

该&&是告诉命令shell,还有另一种命令来执行的方式。


查看完整回答
反对 回复 2019-09-21
?
富国沪深

另一个答案暗示在较新版本的Windows下,似乎有必要读取标准输出和/或标准错误流,否则它将在命令之间停滞。这样做而不是使用延迟的更整洁的方法是使用异步回调来消耗流的输出:


static void RunCommands(List<string> cmds, string workingDirectory = "")

{

    var process = new Process();

    var psi = new ProcessStartInfo();

    psi.FileName = "cmd.exe";

    psi.RedirectStandardInput = true;

    psi.RedirectStandardOutput = true;

    psi.RedirectStandardError = true;

    psi.UseShellExecute = false;

    psi.WorkingDirectory = workingDirectory;

    process.StartInfo = psi;

    process.Start();

    process.OutputDataReceived += (sender, e) => { Console.WriteLine(e.Data); };

    process.ErrorDataReceived += (sender, e) => { Console.WriteLine(e.Data); };

    process.BeginOutputReadLine();

    process.BeginErrorReadLine();

    using (StreamWriter sw = process.StandardInput)

    {

        foreach (var cmd in cmds)

        {

            sw.WriteLine (cmd);

        }

    }

    process.WaitForExit();

}


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信