Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行外部进程,等待程序结束,获取exitcode并保持控制台打开?_C#_Process_Cmd - Fatal编程技术网

C# 运行外部进程,等待程序结束,获取exitcode并保持控制台打开?

C# 运行外部进程,等待程序结束,获取exitcode并保持控制台打开?,c#,process,cmd,C#,Process,Cmd,我想一个接一个地运行几个程序,但有时我想打开它们的控制台窗口以查看消息/错误 是否可以运行cmd.exe/K anotherProgram.exe,等待另一个程序完成(WaitForExit())并获取另一个程序的exitCode?或者,除了从cmd/K?运行控制台外,我还可以通过其他方式保持控制台打开。您可以捕获控制台程序的输出和错误流,以获取消息/错误。 这样你也可以得到程序的退出代码 请查看-类中可用的事件: ==>使用此选项捕获标准输出消息 ==>使用此选项捕获错误消息 ==>使用此项获

我想一个接一个地运行几个程序,但有时我想打开它们的控制台窗口以查看消息/错误


是否可以运行
cmd.exe/K anotherProgram.exe
,等待另一个程序完成(
WaitForExit()
)并获取另一个程序的exitCode?或者,除了从
cmd/K

运行控制台外,我还可以通过其他方式保持控制台打开。您可以捕获控制台程序的输出和错误流,以获取消息/错误。 这样你也可以得到程序的退出代码

请查看-类中可用的事件:

==>使用此选项捕获标准输出消息

==>使用此选项捕获错误消息

==>使用此项获取退出代码

下面是一个有关格式化驱动器的示例(无例外处理和参数测试),其中控制台窗口不可见,输出和错误流被捕获并显示在MessageBox中。 退出流程时也会检查退出代码

private Process formatProc;

Private void DoFormat(string driveLetter) 
    this.formatProc = new Process
    {
        StartInfo =
            {
                UseShellExecute = false,
                FileName = "format.com",
                Arguments = string.Format("/FS:FAT {0}: /V: /Q", driveLetter),
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden
            },
        EnableRaisingEvents = true
    };

    this.formatProc.OutputDataReceived += this.ProcOutputDataReceivedHandler;
    this.formatProc.ErrorDataReceived += this.ProcErrorDataReceivedHandler;
    this.formatProc.Exited += this.ProcExitedHandler;

    this.formatProc.Start();
    this.formatProc.BeginOutputReadLine();
    this.formatProc.BeginErrorReadLine();
}

private void ProcOutputDataReceivedHandler(object sendingProcess, DataReceivedEventArgs e)
{
    if (string.IsNullOrEmpty(e.Data))
    {
        MessageBox.Show(e.Data);
    }
}

private void ProcErrorDataReceivedHandler(object sendingProcess, DataReceivedEventArgs e)
{
    if (string.IsNullOrEmpty(e.Data))
    {
        MessageBox.Show(e.Data);
    }
}

private void ProcExitedHandler(object sender, EventArgs e)
{
    var exitCode = this.formatProc.ExitCode;
    var message = string.Empty;
    switch (exitCode)
    {
        case 0: 
            message = "Format done.";
            break;
        case 1:
            message = "Format failed. Incorrect parameters were supplied.";
            break;
        case 4:
            message = "Format failed. A fatal error occurred.";
            break;
        case 5:
            message = "Format ended by user.";
            break;
        default:
            message = "Format failed. ExitCode = " + this.formatProc.ExitCode;
            break;
    }

    this.formatProc.Dispose();
    MessageBox.Show(message);
}

你的意思是,让控制台窗口保持打开状态,以便用户可以读取输出?可以捕获控制台窗口的输出,因此不需要保持打开状态。是的,我想让控制台窗口保持打开状态,因为我认为它所需的代码比捕获输出并在某处显示所需的代码要少。正如我在上面的评论中提到的,我不想捕获输出,但我看到它是唯一的方法,所以我将它标记为答案。谢谢