当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用.NET使用相同的进程执行多个命令行》经验,为你挑选了5个好方法。

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

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

scottm.. 76

您可以重定向标准输入并使用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;");
            }
        }

对我来说很好.也许这可以标记为答案? (3认同)


Filip.. 44

const string strCmdText = "/C command1&command2";
Process.Start("CMD.exe", strCmdText);


M4N.. 12

难道你不能只将所有命令写入临时文件夹中的.cmd文件,然后执行该文件吗?



1> scottm..:

您可以重定向标准输入并使用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;");
            }
        }


对我来说很好.也许这可以标记为答案?

2> Filip..:
const string strCmdText = "/C command1&command2";
Process.Start("CMD.exe", strCmdText);



3> M4N..:

难道你不能只将所有命令写入临时文件夹中的.cmd文件,然后执行该文件吗?


不知道为什么这被标记为不是答案,只是因为它以问号结束并不会使它不是答案= p

4> 小智..:
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,还有另一种命令来执行的方式。


“ &&”表示如果左命令失败,则不会执行右命令,请参阅http://support.microsoft.com/kb/279253/zh-cn。您可以仅在不希望的情况下使用单个`&`

5> PeterJ..:

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

static void RunCommands(List 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();
}

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有