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";
仅 运行 命令而不启动新的控制台进程。
我有一个以控制台模式启动 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";
仅 运行 命令而不启动新的控制台进程。