Журнал Msbuild не работает, когда выполняется через powershell
Когда я использую командный файл для вызова msbuild.exe, функция ведения журнала работает нормально.
Но когда он написан в powershell, он ничего не записывает.
Ниже приведена команда powershell script. Любая идея, как это решить?
# Script to invoke build
. ./vsvars32.ps1
Remove-Item "ViewBuild1.log"
$MsbuildBinPath="C:\Windows\Microsoft.NET\Framework\v4.0.30319"
$errorLogFileName="ViewBuild1Errors.log"
$buildLogFileName="ViewBuild1.log"
$MSBuildLogger="/flp1:Append;LogFile=ViewBuild1.log;Verbosity=Normal; /flp2:LogFile=ViewBuild1Errors.log;Verbosity=Normal;errorsonly"
$MSBuildFile="Build.Targets"
Write-Host --------------------------------------------
Write-Host Prepare for the build
Write-Host --------------------------------------------
&"$MsbuildBinPath\Msbuild.exe" $MSBuildFile "/t:Prepare" "$MSBuildLogger"
if ($LastExitCode -ne 0) {
Write-Host "It failed, send a mail"
}
#$LastExitCode
&"$MsbuildBinPath\Msbuild.exe" $MSBuildFile "/t:BuildAll" "$MSBuildLogger"
Viewbuild1.log не имеет никакого содержимого после выполнения, хотя я использовал параметр append в filelogger.
Ответы
Ответ 1
Все $MSBuildLogger
передаются как один аргумент в MSBuild, например:
PS> $MSBuildLogger="/flp1:Append;LogFile=ViewBuild1.log;Verbosity=Normal; /flp2:LogFile=ViewBuild1Errors.log;Verbosity=
Normal;errorsonly"
PS> echoargs $MSBuildLogger
Arg 0 is </flp1:Append;LogFile=ViewBuild1.log;Verbosity=Normal; /flp2:LogFile=ViewBuild1Errors.log;Verbosity=Normal;erro
rsonly>
Попробуйте вместо этого использовать две переменные:
PS> $MSBuildLogger1="/flp1:Append;LogFile=ViewBuild1.log;Verbosity=Normal;"
PS> $MSBuildLogger2="/flp2:LogFile=ViewBuild1Errors.log;Verbosity=Normal;errorsonly"
PS> echoargs $MSBuildLogger1 $MSBuildLogger2
Arg 0 is </flp1:Append;LogFile=ViewBuild1.log;Verbosity=Normal;>
Arg 1 is </flp2:LogFile=ViewBuild1Errors.log;Verbosity=Normal;errorsonly>
FYI, echoargs.exe - это утилита из Расширений сообщества PowerShell.
Ответ 2
Совместите всю команду MSBuild в качестве powershell var, а затем используйте Invoke-Command для ее выполнения. Я делаю это, и он отлично работает!
$console_logging_switch = " /clp:Summary"";""Verbosity=$consoleLogLevel"
$file_logging_switch = " /flp:Summary"";""Append"";""LogFile=build.$config.log"";""verbosity=normal"
$file_errlog_switch = " /flp1:Append"";""LogFile=build.$config.err"";""errorsonly"
$file_wrnlog_switch = " /flp2:Append"";""LogFile=build.$config.wrn"";""warningsonly"
$logging_switch = $console_logging_switch + $file_logging_switch + $file_errlog_switch + $file_wrnlog_switch
$targets_switch = " /t:$targets"
$outdir_switch = " /p:OutDir=""$outdir"""
$config_switch = " /p:Configuration=""$config"""
if($skipCodeAnalysis){ $config_switch = " $config_switch /p:RunCodeAnalysis=false " }
if($buildReferences){ $config_switch = " $config_switch /p:BuildProjectReferences=false " }
if($filter -ne $null){ $config_switch = " $config_switch /p:ProjectFilter=$filter " }
$options = $outdir_switch + $config_switch + $logging_switch + $targets_switch
$cmd = "msbuild $project $options"
Invoke-Expression $cmd