我有一个MSBuild任务执行(除其他外)调用xcopy.我发现,当我从批处理文件运行MSBuild任务时,对xcopy的这个调用正确执行,并且无法执行或生成任何输出,这将允许我知道当从另一个调用相同的批处理文件时发生了什么使用System.Diagnostics.Process的C#应用程序.
两个进程都启动时具有或多或少相同的结构:
waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;
Run Code Online (Sandbox Code Playgroud)
此外,通过在xcopy命令中将"UseShellExecute"从false更改为true,我可以在两个用例中成功,但是命令无法在第三个用例中运行.第三个用例是我们的自动构建系统,它是一个直接调用msbuild的Windows服务.在我们的构建机器上发生故障的情况下,copy命令无限期挂起,我相信,因为System.Diagnostics.Process试图显示一个窗口,而服务没有与它们关联的Windows桌面会话,所以它们不能显示窗口.
我已经尝试使用"CreateNoWindow"属性,我已经尝试将"WindowStyle"设置为"ProcessWindowStyle.Hidden",但这并没有改变构建机器上的行为.
所有这些都说,我真正想知道的是UseShellExecute属性究竟是什么,因为它似乎比MSDN文档建议的要多得多.
谢谢.