0

C# WinForms 应用程序 (.NET 4)

从组合(下拉)菜单中选择目录路径,然后将其包含在以下命令行语句中。

for %f in ("< path >\*.ocx" "< path >\*.dll") do regsvr32 /s "%f"

其中<path>是目录路径。

这执行得很好。我想检索注册成功消息(或错误),而用户不必在显示的弹出/消息框中单击确定一千次。显然,静音 (/s) 开关摆脱了弹出窗口。

在用户在屏幕上看到任何内容(除了应用程序本身)的情况下,检索结果的最佳方法是什么?

这就是我现在所拥有的,

public void reg_in_source_2()
{
    ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
    cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
    cmdStartInfo.RedirectStandardOutput = true;
    cmdStartInfo.RedirectStandardError = true;
    cmdStartInfo.RedirectStandardInput = true;
    cmdStartInfo.UseShellExecute = false;
    cmdStartInfo.CreateNoWindow = true;

    Process cmdProcess = new Process();
    cmdProcess.StartInfo = cmdStartInfo;
    cmdProcess.ErrorDataReceived += cmd_Error;
    cmdProcess.OutputDataReceived += cmd_DataReceived;
    cmdProcess.EnableRaisingEvents = true;
    cmdProcess.Start();
    cmdProcess.BeginOutputReadLine();
    cmdProcess.BeginErrorReadLine();

    cmdProcess.StandardInput.WriteLine(@"for %%f in (""" + reference.source_folder + @"\*.ocx"" " + reference.source_folder + @"\*.dll"") do regsvr32 ""%%f""");
    cmdProcess.StandardInput.WriteLine("exit");

    cmdProcess.WaitForExit();
}

public void cmd_DataReceived(object sender, DataReceivedEventArgs e)
{
    reference.cmd_replies.Add(e.Data);
}

public void cmd_Error(object sender, DataReceivedEventArgs e)
{
    reference.cmd_replies_errors.Add(e.Data);
}
4

2 回答 2

2

与其尝试将批处理脚本写入 cmd 进程,不如使用它Directory.GetFiles("c:\\somepath\\", "*.dll;*.ocx")来获取要注册的文件 -然后用于process.start启动regsvr32进程(使用/silent参数)并检查返回码以了解您是否成功。

如果您尝试在脚本中执行此操作,您将只获得 cmd 进程的返回码,而不是您感兴趣的 regsvr32 进程的返回码。

于 2013-03-11T16:09:54.813 回答
1

请通过设置 Environment.Exit(code) 从控制台应用程序返回退出代码。

您可以将退出代码设置为此stackoverflow 答案中的链接

默认值为 0(零),表示进程成功完成。使用非零数字表示错误。在您的应用程序中,您可以在枚举中定义自己的错误代码,并根据场景返回相应的错误代码

所有错误代码都可以映射到它们的状态消息,然后可以记录这些消息。

于 2013-03-11T16:08:10.457 回答