如何重定向应用程序的标准输入/输出






4.84/5 (40投票s)
2007年4月27日
4分钟阅读

360520

15507
本文演示了如何重定向应用程序的标准输入/输出。
引言
我正在做一个项目,需要从一个应用程序启动一个辅助进程,并从应用程序将所需的参数和输入传递给辅助进程,同时捕获辅助进程的所有可能的输出和错误。我也不希望辅助进程的异常和崩溃直接显示给用户。本文简要介绍了我是如何实现这一点的。我需要控制辅助进程的标准输入、标准输出和标准错误。
下面是我的代码在实际运行中的一个例子。关机过程是从我的应用程序中调用的,它会显示进程的输出。由于我们没有为辅助进程提供选项或参数,它会捕获标准输出并显示出来。
我使用了 `System.Diagnostics` 中的 `Process` 类,它可以为您启动一个进程。(大多数人都知道这一点,但他们没有意识到它能提供的帮助有多大)。我将一步一步地解释这个过程,并附上代码片段,以便您能够轻松理解。
使用代码
步骤 1: 创建一个 `ProcessStartInfo` 对象。这用于执行可执行文件。`ProcessStartInfo` 有三个构造函数。您可以使用其中任何一个,或者在稍后(但在启动进程之前)指定文件名和参数。
ProcessStartInfo processStartInfo =
new ProcessStartInfo(executableName, executableParameter);
- `executableName` 是可执行文件的完整路径。如果可执行文件位于环境变量中注册的位置,您可以省略完整路径而只指定可执行文件名。
- `executableParameter` 是传递给可执行文件的参数列表。应用程序将使用这些参数启动。
现在,默认情况下,框架使用 Shell Execute 来调用应用程序。将 `UseShellExecute` 属性设置为 `false`。您还需要将 `ErrorDialog` 属性设置为 `false`。那么为什么要将 `UseShellExecute` 设置为 `false` 呢?从 MSDN 文档中,您可以找到,默认情况下,shell 用于启动进程。现在,为了捕获输入/输出/错误,我们需要直接从可执行文件创建进程。通过这样做,如果应用程序暴露了任何输入/输出/错误,我们就可以从中获取。
processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;
步骤 2: 现在,最重要的事情来了;我们需要将重定向属性设置为 `true`。根据您的方便进行设置。但是,您可以使用任何其他应用程序。
processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
步骤 3: 现在一切就绪,我们准备捕获输入/输出/错误。启动进程。
Process process = new Process();
process.StartInfo = processStartInfo;
bool processStarted = process.Start();
步骤 4: 捕获输入/输出/错误流以供您使用。请注意,输入流是一个 writer。要提供输入,您需要将输入字符串写入输入流。
StreamWriter inputWriter = process.StandardInput;
StreamReader outputReader = process.StandardOutput;
StreamReader errorReader = process.StandardError;
process.WaitForExit();
步骤 5: 完成;按需使用这些流。
关注点
代码本身很简单,容易理解。但这些是能够帮助您理解 `Process` 的要点。
- `WaitForExit()` 函数将等待直到应用程序退出。
- 在示例应用程序中,我没有使用输入流。您也可以使用它来为应用程序提供输入。
- `Process.Start()` 方法返回一个 `bool` 值,表示进程已成功启动。
- `Process.ExitCode` 返回进程返回的错误代码。如果为 0,则表示进程在没有错误的情况下退出。这在某些情况下可能对用户很有帮助。
- `EnableRaisingEvents` 属性使您能够引发 `Exited` 事件。因此,如果您想使用 `Exited` 事件,请确保将其设置为 `true`。
- `ProcessStartInfo.ErrorDialog` 允许您设置在进程未成功启动时是否显示错误消息。
- 您可以在 `ProcessStartInfo` 对象中为进程提供域名、用户名和密码。
- `ProcessStartInfo.CreateNoWindow` 允许您创建一个不创建窗口的进程。
历史
这是该代码的第一个版本。将根据请求进行修改和功能增强。我请求用户通过电子邮件直接联系我,以获得任何建议。在此示例中,我没有使用输入流;如果您在这方面有困难,请给我留言,我将提供一个示例。