我有一个 MSBuild 任务,它执行(除其他外)对 xcopy 的调用。我发现,当我从批处理文件运行 MSBuild 任务时,对 xcopy 的调用可以正确执行,并且无法执行或生成任何输出,无法让我知道从另一个批处理文件调用同一个批处理文件时发生了什么具有 System.Diagnostics.Process 的 C# 应用程序。
这两个进程都以或多或少相同的结构启动:
waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;
此外,通过将 xcopy 命令上的“UseShellExecute”从 false 更改为 true,我可以在两个用例中都成功,但是该命令在第三个用例中无法运行。第三个用例是我们的自动构建系统,它是直接调用 msbuild 的 Windows 服务。如果我们的构建机器出现故障,复制命令会无限期挂起,我相信这是因为 System.Diagnostics.Process 尝试显示一个窗口,而服务没有与之关联的 Windows 桌面会话,因此它们无法显示窗口。
我尝试过使用“CreateNoWindow”属性,并且尝试将“WindowStyle”设置为“ProcessWindowStyle.Hidden”,但这不会改变构建计算机上的行为。
综上所述,我真正想知道的是 UseShellExecute 属性到底做了什么,因为它的作用似乎比 MSDN 文档建议的要多得多。
Thanks.
ProcessStartInfo.UseShellExecute http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute.aspx告诉进程使用 Windows Shell 执行指定的应用程序。
如果没有这个设置,你只能直接执行一个EXE文件。通过设置此选项,您可以使用 Windows Shell,从而允许指定 .doc 文件并让关联的程序打开该文件等操作。
但是,使用 Windows Shell 需要有效的桌面上下文,这就是您的第三个用例失败的原因。
一般来说,使用cmd.exe
除非您使用 Windows Shell,否则这是有问题的。您可能只想编写代码来直接处理“批处理”操作 - 即:使用System.IO命名空间 http://msdn.microsoft.com/en-us/library/system.io.aspx进行复印。这样就可以完全避免这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)