2

我正在使用 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,所以仍然感谢这些答案。

4

4 回答 4

14

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

$output = [string](nuget.exe)

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

于 2013-02-23T14:52:55.603 回答
3

我已经使用我的问题的第一条评论中的建议解决了我的问题,即将构建输出写入日志文件,使用它,然后删除它。如果他们需要,这允许我仍然向用户显示带有构建进度的 cmd 窗口,并在构建完成后检查构建输出。它还允许我在另一个进程中运行构建,因此如果我们不希望我们的脚本在继续执行之前等待构建完成,我们可以使用 PassThru。

我创建了一个 Invoke-MsBuild powershell 模块,以使使用 MsBuild 构建变得轻而易举,同时为附加功能提供大量参数(如果构建成功或失败则返回,可以显示/隐藏构建窗口,可以等待/不等待构建完成,可以自动显示失败构建的构建日志等)。您可以从我的博客查看和下载脚本

于 2013-04-10T17:46:24.800 回答
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

于 2013-02-24T12:15:48.917 回答
0

编辑:我最终使用了@David Brabant 的回答

我遇到了这个问题并创建了一个回显函数

function echo()
{
    $input
}

这让我这样做

$output = &"cmd.exe" $args | echo
于 2014-03-14T01:59:04.220 回答