从网络上的各种来源,我已经把下面的代码用于经由执行命令CMD.exe,并从捕获输出STDOUT和STDERR。
public static class Exec
{
public delegate void OutputHandler(String line);
// <summary>
/// Run a command in a subprocess
/// </summary>
/// <param name="path">Directory from which to execute the command</param>
/// <param name="cmd">Command to execute</param>
/// <param name="args">Arguments for command</param>
/// <param name="hndlr">Command output handler (null if none)</param>
/// <param name="noshow">True if no windows is to be shown</param>
/// <returns>Exit code from executed command</returns>
public static int Run(String path, String cmd, String args,
OutputHandler hndlr = null, Boolean noshow = true)
{
// Assume an error
int ret = 1;
// Create a process
using (var p = new Process())
{
// Run command using CMD.EXE
// (this way we can pipe STDERR to STDOUT so they can get handled together)
p.StartInfo.FileName = "cmd.exe";
// Set working directory (if supplied)
if (!String.IsNullOrWhiteSpace(path)) p.StartInfo.WorkingDirectory = path;
// Indicate command and arguments
p.StartInfo.Arguments = "/c \"" + cmd + " " + args + "\" 2>&1";
// Handle noshow argument
p.StartInfo.CreateNoWindow = noshow;
p.StartInfo.UseShellExecute = false;
// See if handler provided
第一次运行不收集任何输出,只显示退出代码。
第二次运行不会收集任何输出,但会显示窗口。
这样做的效果是输出实时出现在控制台窗口中。
第三次运行使用 GetOutput 来收集输出。
这样做的效果是在运行完成之前不会出现输出。
最后一次运行使用处理程序实时接收和显示输出。
从外观上看,这看起来像第二次运行,但它非常不同。
对于接收到的每一行输出,调用 ShowString。
Show string 只是显示字符串。
然而,它可以对数据做任何它需要的事情。
我正在尝试调整最后一次运行,以便我可以使用命令的输出实时更新文本框。我遇到的问题是如何在正确的上下文中使用它(因为没有更好的术语)。因为 OutputHandler 是异步调用的,所以它必须使用InvokeRequired/BeginInvoke/EndInvoke
机制与 UI 线程同步。我对如何使用参数执行此操作有一点问题。在我的代码中,文本框可能是选项卡控件中的几个之一,因为可能会发生多个背景“运行”。
潇湘沐
相关分类