2011-10-06 95 views
1

我想从Windows服务(以我自己的用户身份运行)运行此批处理文件,并且msbuild不起作用。直接运行它可行。我在stderr上收到了一个“The handle is invalid”的消息,我认为它是vcvarsall.bat。如何从Windows服务运行msbuild?

rem Load compilation environment 
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" 
rem Load the All Solutions.sln program 
msbuild "C:\AutoBuildCheckout\Other Projects\All Projects\All Projects.sln" 
pause 

我很困惑。任何人有任何建议?

-Isaac

回答

1

服务在Windows Vista和更高一个单独的桌面运行,因此不必stdinstdout,并stderr访问。 (服务不能再'与桌面互动';您会注意到控制面板中的服务小程序中缺少该选项。)

编辑:在下面的注释之后...服务IMO是错误的解决方案。有持续集成产品可以为您管理此类产品,如HudsonCruiseControl;我相信还有很多其他人。另见维基百科上的Continuous Integration欲知更多信息。

+0

我可以使用Process.StartInfo.RedirectStandardOutput获取标准错误和输出,然后使用StreamReader读取它。无论如何,我有一个主解决方案文件,最终会有几十个项目,每个项目都依赖于一些核心库项目。我正在使用后提交挂钩脚本来发送命令到服务,以尝试构建主解决方案。然后,如果批处理文件的出口代码不是零,我会发送错误消息和电子邮件给谁打破构建。 –

+0

我最初选择了一项服务,因此一次只能运行一个构建版本。我也希望有一天使用这个服务来自动运行测试套件。 –

+0

您可能能够连接到标准输入和标准输出,但不是您的批处理文件使用的cmd.exe。你的理由对我来说也没有意义;通过服务执行构建不会阻止多个构建的执行,还有其他方式可以自动运行测试套件。您应该查看MSBuild中的构建前和构建后事件(例如,构建后可以自动运行测试)。一项服务对我来说似乎完全不合适,但这只是我的看法,而且你知道这些是值得的。 :) –

0

我的解决方案是只调用vcvarsall.bat。相反,我直接从它位于windows目录中的位置召唤msbuild。所以我没有真正了解解决方案而解决了问题。