【问题标题】:Retrieve results of regsvr32 execution from command line (without message boxes/popups)从命令行检索 regsvr32 执行的结果(没有消息框/弹出窗口)
【发布时间】:2013-03-11 15:49:04
【问题描述】:

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

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

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

其中是目录路径。

这执行得很好。我想检索注册成功消息(或错误),而用户不必在显示的弹出/消息框中单击确定一千次。显然,静音 (/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);
}

【问题讨论】:

  • 您是否尝试获取退出代码?通常如果它是 0 表示成功
  • 我没有,你有没有偶然的链接或例子?
  • 在 WaitForExit 进程之后看起来像 reference.cmd_exit_code = cmdProcess.ExitCode;。这将如何工作,因为我需要知道的不仅仅是单个文件没有注册,我还需要知道有多少失败。我想我可以为目录中的每个文件启动一个注册过程...捕获退出代码并在总操作结束时计算结果。
  • 你为什么要写一个批处理脚本到 cmd 进程,而不是在代码中找到文件然后在这些文件上执行 regsvr32?

标签: c# command-line regsvr32


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您可以在此stackoverflow answer 中设置退出代码

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多