Захват вывода 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.