如何使用PowerShell将命令提示符的输出转换为变量

dea*_*dog 2 powershell command-prompt powershell-3.0

我正在使用PowerShell v3.0启动一个新的cmd.exe进程,然后在其中加载Visual Studio命令提示符以执行构建,如下所示:

Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuildInVsCommandPrompt -WindowStyle $windowStyle -Wait
Run Code Online (Sandbox Code Playgroud)

这工作,它打开一个新的命令提示符窗口,我可以看到构建发生,然后当构建完成时,命令提示符窗口关闭.我希望能够获取写入命令提示符窗口的文本并将其存储在变量中,以便检查构建是否通过.我尝试使用它,但它不起作用; $ buildOutput变量为空:

Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuildInVsCommandPrompt -WindowStyle $windowStyle -Wait -OutVariable buildOutput
Write-Host "Build output = $buildOutput"
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为cmd.exe进程没有返回任何文本; 它只是把它写到它自己的窗口.有没有办法让我能够将该文本存储在变量中以供原始的PowerShell脚本使用?我知道我可以为MsBuild提供一个参数,让它将构建日志写入文件,但我正在寻找一种不涉及写入日志文件并且必须在以后删除它的解决方案.

任何建议表示赞赏.谢谢!

<#EDIT#>

感谢到目前为止的所有回复!一个流行的建议是直接调用MsBuild.exe而不使用cmd.exe.我需要通过cmd.exe的原因是,如果直接从MsBuild.exe调用(例如XNA项目),某些项目无法成功构建.相反,我需要从Visual Studio命令提示符调用MsBuild.exe,以便(我假设)设置所有必需的环境变量.我想我可以直接调用VS命令提示符,但它也会遇到与调用cmd.exe相同的问题.如果我找不到VS命令提示符,我会回退直接调用MsBuild.exe,所以仍然可以理解这些答案.

Dav*_*ant 11

您始终可以通过以下方式捕获控制台程序的输出:

$output = [string](nuget.exe)
Run Code Online (Sandbox Code Playgroud)

这里我使用了nuget($ output将包含可用的命令列表),但你当然可以使用带有适当参数的msbuild.exe.