我使用PowerShell v3.0启动新的cmd.exe进程,然后在其中加载Visual Studio命令提示符以执行生成,如下所示:如何使用PowerShell将命令提示符的输出转换为变量
Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuildInVsCommandPrompt -WindowStyle $windowStyle -Wait
这个工作,它会打开一个新的命令提示符窗口中,我可以看到生成发生,然后在构建完成的提示窗口关闭的命令。我希望能够获得写入命令提示符窗口的文本并将其存储在变量中,以检查构建是否通过。我尝试过使用它,但它不起作用; $ buildOutput变量为空:
Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuildInVsCommandPrompt -WindowStyle $windowStyle -Wait -OutVariable buildOutput
Write-Host "Build output = $buildOutput"
这很有意义,因为cmd.exe进程没有返回任何文本;它只是将它写入它自己的窗口。有没有办法让我能够将该文本存储在原始PowerShell脚本使用的变量中?我知道我可以为MsBuild提供一个参数,让它将构建日志写入文件,但是我正在寻找一种不涉及写入日志文件并稍后删除它的解决方案。
任何建议表示赞赏。谢谢!
<#编辑#>
感谢所有迄今的答复!一个流行的建议是直接调用MsBuild.exe而不使用cmd.exe。我需要通过cmd.exe的原因是,如果直接从MsBuild.exe调用某些项目(例如XNA项目),则无法成功构建。相反,我需要从Visual Studio命令提示符中调用MsBuild.exe,以便(我假设)设置了所有必需的环境变量。我想我可以直接调用VS命令提示符,但它也会有和调用cmd.exe一样的问题。如果我找不到VS命令提示符,我会直接调用MsBuild.exe,所以这些答案仍然值得赞赏。
为什么不用它写入日志?您可以使用PowerShell立即使用日志文件并将其删除。 – Matt 2013-02-23 00:16:46
直接调用msbuild(或适当的可执行文件)并避免'cmd.exe'?我不确定'cmd.exe'“是否有”stdout。也许这受'/ c'标志影响? – 2013-02-23 00:22:33
您可以将其作为后台作业运行(使用cmd/c),并使用接收作业控制输出的显示和最终处置。 – mjolinor 2013-02-23 01:59:28