我正在使用PowerShell v3.0启动一个新的cmd.exe进程,然后在其中加载Visual Studio命令提示符以执行构建,如下所示:
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提供一个参数,让它将构建日志写入文件,但我正在寻找一种不涉及写入日志文件并且必须在以后删除它的解决方案。
任何建议都表示赞赏。谢谢!
<#EDIT#>
感谢目前为止的所有回复!一个流行的建议是直接调用MsBuild.exe而不使用cmd.exe。我需要通过cmd.exe的原因是,如果直接从MsBuild.exe(例如XNA项目)调用,某些项目无法成功构建。相反,我需要从Visual Studio命令提示符调用MsBuild.exe,以便(我假设)设置所有必需的环境变量。我想我可以直接调用VS命令提示符,但它也会遇到与调用cmd.exe相同的问题。如果我找不到VS命令提示符,我会直接回复调用MsBuild.exe,所以仍然可以理解这些答案。
答案 0 :(得分:11)
您始终可以通过以下方式捕获控制台程序的输出:
$output = [string](nuget.exe)
这里我使用了nuget($ output将包含可用的命令列表),但您当然可以使用带有相应参数的msbuild.exe。
答案 1 :(得分:3)
我已经使用我的问题的第一条评论中的建议解决了我的问题,该建议是将构建输出写入日志文件,使用它,然后删除它。这允许我仍然向用户显示具有构建进度的cmd窗口(如果需要),并在构建完成后检查构建输出。它还允许我在另一个进程中运行构建,因此如果我们不希望脚本在继续执行之前等待构建完成,我们可以使用PassThru。
我创建了一个Invoke-MsBuild powershell模块,使得使用MsBuild构建一个快照,同时为其他功能提供了大量参数(如果构建成功或失败,可以显示/隐藏构建窗口,可以等待/不等待构建完成后,可以自动显示构建日志失败的构建等)。你可以view and download the script from my blog。
答案 2 :(得分:2)
$process = New-Object System.Diagnostics.Process;
$process.StartInfo.UseShellExecute = $false;
$process.StartInfo.RedirectStandardOutput = $true;
$process.StartInfo.FileName = "cmd.exe";
$process.StartInfo.Arguments = $cmdArgumentsToRunMsBuildInVsCommandPrompt;
$process.Start();
$outputStream = $process.StandardOutput;
$outputStream.ReadToEnd();
您还可以重定向StandardError
。
答案 3 :(得分:0)
编辑:我最终使用了@David Brabant的回答
我遇到了这个问题并创建了一个echo函数
function echo()
{
$input
}
让我这样做
$output = &"cmd.exe" $args | echo