C# 运行 没有新 window 的批处理脚本并将所有 (standard/error) 输出重定向到 RichTextBox

C# run a batch script without a new window and redirect all (standard/error) output to a RichTextBox

我有一个以控制台模式启动 mariadb 的批处理脚本,所以它看起来像这样:

运行-mariadb.bat

@echo off
cd /D mariadb-10.1.14-win32\bin && mysqld.exe --console
@pause

使用 C# WinForm 应用程序,我想启动这个批处理脚本并将所有输出到 RichTextBox。

这是我目前的代码:

// Configure db server process
Process dbServer = new Process();
dbServer.StartInfo.FileName = "cmd";
dbServer.StartInfo.Arguments = "/c start /wait run-mariadb.bat";
dbServer.StartInfo.CreateNoWindow = true;
dbServer.StartInfo.UseShellExecute = false;
dbServer.StartInfo.RedirectStandardOutput = true;
dbServer.StartInfo.RedirectStandardError = true;
dbServer.OutputDataReceived += new DataReceivedEventHandler(HandleDBServerOutput);
dbServer.ErrorDataReceived += new DataReceivedEventHandler(HandleDBServerOutput);

这些是我的辅助方法:

string FormatOutput(string message)
{
    return string.Format("[ {0} ] : {1}",
        DateTime.Now.ToShortTimeString(),
        message);
}

void HandleDBServerOutput(object sender, DataReceivedEventArgs e)
{
    this.BeginInvoke(new MethodInvoker(() =>
    {
        if (!string.IsNullOrEmpty(e.Data))
            dbLogsRTB.AppendText(FormatOutput(e.Data));
    }));
}

我这样开始这个过程:

// Start database server
dbServer.Start();
dbServer.BeginOutputReadLine();
dbServer.WaitForExit();

当上述执行时,一个新的命令提示符 window 被创建并且 mariadb 正在其中 运行ning。知道为什么 dbServer.StartInfo.CreateNoWindow = true; 被忽略了吗?

start 的帮助开始于:

Starts a separate window to run a specified program or command.

换句话说,通过 运行ning start 作为命令的一部分,您将启动一个新的 window。您可以在命令提示符下通过 运行ning start /wait run-mariadb.bat 来验证这一点。它启动一个新的 window 到 运行 命令。

考虑将您的命令更改为简单的:

dbServer.StartInfo.Arguments = "/c run-mariadb.bat";

仅 运行 命令而不启动新的控制台进程。