我正在使用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提供一个参数,让它将构建日志写入文件,但我正在寻找一个不需要写入日志文件并在以后删除它的解决方案。
欢迎提出任何建议。谢谢
<#编辑#>
感谢迄今为止的所有回复!一个流行的建议是直接调用MsBuild.exe而不使用cmd.exe。我需要通过cmd.exe的原因是,如果直接从MsBuild.exe调用某些项目,则无法成功构建(例如XNA项目(。相反,我需要从Visual Studio命令提示符调用MsBuild.exe,以便(我认为(设置所有必需的环境变量。我想我可以直接调用VS命令提示符,但它也会出现与调用cmd.exe相同的问题。如果我找不到VS命令提示符,我会直接调用MsBuild.exe,所以我们仍然很感激这些答案。
您总是可以通过以下方式捕获控制台程序的输出:
$output = [string](nuget.exe)
这里我使用了nuget($output将包含可用的命令列表(,但您当然可以使用带有适当参数的msbuild.exe。
我使用问题第一条评论中的建议解决了我的问题,即将构建输出写入日志文件,使用它,然后删除它。这使我仍然可以在用户需要时向他们显示带有构建进度的cmd窗口,并在构建完成后检查构建输出。它还允许我在另一个进程中运行构建,因此如果我们不希望脚本在继续执行之前等待构建完成,我们可以使用PassThru。
我创建了一个Invoke-MsBuild powershell模块,使使用MsBuild进行构建成为一个快照,同时为其他功能提供了大量参数(如果构建成功或失败则返回,可以显示/隐藏构建窗口,可以等待/不等待构建完成,可以自动显示失败构建的构建日志,等等(。您可以从我的博客中查看和下载脚本。
$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
。
edit:我最终使用了@David Brabant的答案
我遇到了这个问题,并创建了一个回波函数
function echo()
{
$input
}
让我做这个
$output = &"cmd.exe" $args | echo