Захват вывода MSBuild.exe в сценарий PowerShell

Я создаю несколько новых сценариев сборки для проекта, использующего PowerShell, и хотел бы захватить вывод MSBuild при его вызове и сохранить его в текстовом файле. Я попробовал несколько разных способов сделать это безуспешно - вот что я в последний раз пробовал (Write-Buildlog просто обрабатывает запись вывода в журнал):

Start-Process $ msBuildExecutable $ buildArgs -Wait | Написать-Buildlog

Вывод вообще не производится, хотя MSBuild работает нормально. Буду признателен за любые советы, так как я немного поискал и пока не нашел ничего полезного, что удивительно:)

Спасибо!

5 ответов

Решение

Если вы хотите направить вывод из msbuild в командлет регистрации или обработки, не следует начинать его с 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 или хостинга, поэтому получение вывода и отправка командлетам становится намного сложнее. Если вы хотите обрабатывать исполняемый вывод в powershell, то лучше всего просто оставаться в среде powershell все время.

Все, что тебе нужно:

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

или даже: & msbuild.exe .\yourproj.sln |Out-File c:\log.txt

Если запись в файл это то, что вы хотите.

В Start-Process CmdLet у вас есть -RedirectStandardOutput параметр; ты проверял это?

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

Вы также можете перенаправить ошибки с -RedirectStandardError

Вы можете делать с выводом все, что захотите, если запустите его так:

$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 ">" для перезаписи ранее добавленных строк.

Или, если вы хотите просто получить одно слово типа "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

Я думаю, вы должны прочитать о параметрах ведения журнала в командной строке MsBuild: http://msdn.microsoft.com/en-us/library/ms164311.aspx

Msbuild / Logger дает вам хорошие возможности для записи выходных данных. Вы можете использовать этот аргумент в вашем скрипте powershell.

Другие вопросы по тегам