System.Diagnostics.Process UseShellExecute究竟做了什么?

时间:2010-03-03 19:04:05

标签: c# msbuild

我有一个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服务。在我们的构建机器上发生故障的情况下,copy命令无限期挂起,我相信,因为System.Diagnostics.Process试图显示一个窗口,而服务没有与它们关联的Windows桌面会话,所以它们不能显示窗口。

我尝试过使用“CreateNoWindow”属性,我尝试将“WindowStyle”设置为“ProcessWindowStyle.Hidden”,但这并没有改变构建机器上的行为。

所有这些都说,我真正想知道的是UseShellExecute属性到底是什么,因为它似乎比MSDN文档建议的要多得多。

感谢。

4 个答案:

答案 0 :(得分:28)

ProcessStartInfo.UseShellExecute告诉进程使用Windows Shell执行指定的应用程序。

如果没有此设置,则只能直接执行EXE文件。通过设置它,您可以使用Windows Shell,这允许指定.doc文件并让关联程序打开文件。

但是,使用Windows Shell需要有效的桌面上下文,这就是您的第三个用例失败的原因。

通常,除非您使用的是Windows Shell,否则使用cmd.exe会有问题。您可能只想编写代码来直接处理“批处理”操作 - 即:使用System.IO namespace中类型的方法进行复制。这样可以完全避免这个问题。

答案 1 :(得分:1)

来自Documentation

  

将此属性设置为false启用   你重定向输入,输出和   错误流。

     

注意:UseShellExecute必须为false   如果UserName属性不为null   引用(在Visual Basic中没有任何内容)或   一个空字符串,或一个   InvalidOperationException将是   扔的时候   Process.Start(ProcessStartInfo)方法   叫做。当你使用操作   系统shell启动进程,你   可以启动任何文件(任何文件)   注册的文件类型与   具有默认打开的可执行文件   动作)并执行操作   文件,如打印,用   流程组件。什么时候   UseShellExecute是false,你可以   只启动可执行文件   流程组件。

     

注意:如果,则UseShellExecute必须为true   您将ErrorDialog属性设置为   真正。 WorkingDirectory属性   表现不同的时候   UseShellExecute是真的比什么时候   UseShellExecute为false。什么时候   UseShellExecute是真的,   WorkingDirectory属性指定   可执行文件的位置。如果   WorkingDirectory是一个空字符串,   理解当前目录   包含可执行文件。

     

当UseShellExecute为false时,   不使用WorkingDirectory属性   找到可执行文件。相反,它是   由启动的进程使用   并且只有在...内有意义   新流程的背景。

答案 2 :(得分:0)

使用'UseShellExecute'IIRC,是允许explorer(主shell)执行进程而不是.NET运行时....除非有人纠正我错了...

答案 3 :(得分:0)

您是否正确指定了WorkingDirectory?您可以通过添加>c:\log.txt 2>c:\err.txt来查看命令的实际输出。运行此添加并检查这些文件