在PowerShell脚本中捕获MSBuild.exe输出

时间:2013-08-06 23:56:56

标签: powershell msbuild build-script

我正在使用PowerShell为项目创建一些新的构建脚本,并希望在我调用它时捕获MSBuild的输出并将其保存到文本文件中。到目前为止,我已经尝试了几种不同的方法,但这是我上次尝试的(Write-Buildlog只是处理将输出写入日志):

  

Start-Process $ msBuildExecutable $ buildArgs -Wait |写Buildlog

虽然MSBuild运行良好,但根本没有捕获任何输出。任何提示都会非常感激,因为我已经做了一些搜索,到目前为止没有找到任何有用的东西,这是令人惊讶的:)

谢谢!

5 个答案:

答案 0 :(得分:3)

如果要将msbuild的输出管道传输到日志记录或处理cmdlet,则不应该使用Start-Process启动它,只需正常执行即可。

PS> msbuild.exe $flag1 $flag2 $thingToBuild | Write-Buildlog

您可能还需要重定向stderr以捕获更多输出。在这种情况下,您需要添加2>&1

PS> msbuild.exe $flag1 $flag2 $thingToBuild  2>&1 | Write-Buildlog

Start-Process将在任何PowerShell环境或托管之外启动您的进程,因此获取输出并发送到cmdlet变得更加困难。如果你想在powershell中处理可执行输出,那么最好只是一直呆在PowerShell环境中。

答案 1 :(得分:2)

Start-Process CmdLet中,您有一个-RedirectStandardOutput参数;你试过吗?

Start-Process -FilePath "C:\Windows\system32\ping.exe" -ArgumentList "MyMachine" -RedirectStandardOutput "c:\temp\p.txt" -NoNewWindow

您还可以使用-RedirectStandardError

重定向错误

答案 2 :(得分:2)

您只需要:

& msbuild.exe .\yourproj.sln |Out-Host

甚至:     &安培; msbuild.exe。\ yourproj.sln | Out-File c:\ log.txt

如果您想要写入文件。

答案 3 :(得分:1)

如果您按照以下方式运行输出,可以对输出执行任何操作:

$MSBuild = [string](MSBuild.exe -argument1 -argument2 -andSoOn)

假设您希望将输出转到文件中。

$MSBuild = [string](MSBuild.exe -argument1 -argument2 -andSoOn) | Out-File C:\text.txt

或者像这样写...

$MSBuild = [string](MSBuild.exe -argument1 -argument2 -andSoOn) 2>&1 >> C:\text.txt

注意:2">>"意味着追加和1">"覆盖以前添加的行。

或者,如果你只想得到一个像#34; true"来自一堆输出。

$MSBuild = [string](MSBuild.exe -argument1 -argument2 -andSoOn)
if($MSBuid -match "true") 
{
    Write-Host "Whatever you want to say about what's true"
}

如果你想在控制台中看到它,你可以这样做。

$MSBuild = [string](MSBuild.exe -argument1 -argument2 -andSoOn) | Out-Host

或者...

$MSBuild = [string](MSBuild.exe -argument1 -argument2 -andSoOn)
Write-Host $MSBuild

答案 4 :(得分:0)

我想,你应该阅读MsBuild命令行中的Logging选项: http://msdn.microsoft.com/en-us/library/ms164311.aspx

Msbuild / Logger为您提供了很好的日志输出选项。您可以在powershell脚本中使用此参数。