2013-08-06 5 views
3

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

Запуск процесс $ msBuildExecutable $ buildArgs -Wait | Write-Buildlog

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

Спасибо!

ответ

3

Если вы хотите вывести трубы из 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 все время.

+0

Привет, это тоже не работает: $ msBuildExecutable + $ buildArgs 2> & 1 | Write-BuildLog Кажется, что не работает MSBuild? – DashRantic

+0

Подробнее ... Я ищу для запуска определенную версию MSBuild, поэтому я имею ее в переменной. Но не кажется, что я могу запустить его так, как вы предлагаете, поэтому я использовал Start-Process в первую очередь - есть ли другой способ, которым я могу это сделать без Start-Process? – DashRantic

+0

Также попробовал: & $ msBuildExecutable $ buildArgs 2> & 1 | Write-BuildLog все еще ничего – DashRantic

2

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

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

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

+0

Спасибо! Но я хочу отправить вывод в свой командлет Write-Buildlog, который не похож на -RedirectStandardError? – DashRantic

+0

«-NoNewWindow» работал для меня. Благодаря! – suhendri

2

Все, что вам нужно:

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

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

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

0

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

MSBuild/Logger дает хорошие возможности для входа выхода. Этот аргумент можно использовать в сценарии powershell.

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.

Или, если вы хотите получить просто одно слово, подобное «истине» из кучи вывода.

$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 

 Смежные вопросы

  • Нет связанных вопросов^_^