C# WinForms应用程序(.NET 4)
从组合式(下拉)菜单中选择目录路径,然后将其包含在下面的命令行语句中。
for %f in ("< path >\*.ocx" "< path >\*.dll") do regsvr32 /s "%f"其中< path >是目录路径。
这个执行得很好。我想检索注册成功的消息(或错误),而不需要用户在弹出/消息框中单击OK一千次。显然,静音(/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);
}发布于 2013-03-11 16:09:54
不要尝试将批处理脚本写入cmd进程,而是使用Directory.GetFiles("c:\\somepath\\", "*.dll;*.ocx")获取要注册的文件--然后使用process.start启动regsvr32进程(带有/silent参数),并检查返回代码以确定您是否成功。
如果您尝试在脚本中这样做,您将只获得cmd进程的返回代码,而不是您感兴趣的regsvr32进程的返回代码。
发布于 2013-03-11 16:08:10
请通过设置Environment.Exit(代码)从控制台应用程序返回退出代码。
可以将退出代码设置为此stackoverflow answer中的链接。
默认值为0(零),表示该进程已成功完成。使用非零数字表示错误。在应用程序中,可以在枚举中定义自己的错误代码,并根据方案返回适当的错误代码。
所有错误代码都可以将状态消息映射到它们,然后可以记录这些消息。
https://stackoverflow.com/questions/15342874
复制相似问题