TFS 2015 Build Powershell Step сообщает об ошибке, но не содержит ошибок
Мой сценарий powershell выполняется без ошибок, о которых сообщается в файле журнала, но шаг сборки TFS 2015 сообщает об ошибке. Нужно ли мне выполнить специальный обратный звонок?
Это новый стиль сборки, а не основанный на XAML.
В скрипте нет ничего особенного, он вызывает robocopy, что происходит успешно.
Вот сценарий:
[CmdletBinding()]
param (
[string]$localWorkspace,
[string]$destination
)
begin{}
process
{
try
{
## Script
$ServiceDirs = Get-ChildItem $localWorkspace -Recurse | ?{ $_.PSIsContainer -eq $True -and $_.Name -match "^Service$" } | % { $_.FullName }
$serviceCollection = @{}
foreach ($Service in $ServiceDirs)
{
$ServiceName = Get-ChildItem $Service | ?{$_.Name -match ".*.csproj$" } | % { $_.BaseName }
$binpath = ($service + "binrelease")
$serviceCollection.Add($serviceName , $binpath)
}
$serviceCollection.GetEnumerator() | % {
Write-Verbose "Processing service: $($_.key)"
$currentDestination = ($destination + "" + $_.key)
$output = robocopy $_.value $currentDestination /MIR /NFL /NDL /NJH /NJS /nc /ns /np
}
}
catch
{
write-host "Caught an exception:"
write-host "Exception Type: $($_.Exception.GetType().FullName)"
write-host "Exception Message: $($_.Exception.Message)"
}
}
end{}
Я могу видеть все выходные данные robocopy, если я отключу его и использую / DEBUG, и ни один из catch в журнале сборки TFS.
Как ни странно, когда Я заставляю ошибку, catch выполняется и шаг сообщает об успехе.
Сообщение об ошибке:
Не удалось выполнить задачу PowerShell. Это привело к провалу задания. Посмотрите на журналы для задания более подробно.
1 ответ:
TL; DR Проверьте коды выхода, используемые в вызовах, или используйте
exit
, чтобы покинуть скрипт.
RoboCopy использует набор кодов выхода, включая:0×00 0 ошибок не было, и копирование не производилось. Исходное и конечное деревья каталогов полностью синхронизированы.
0×01 1 один или несколько файлов были успешно скопированы (то есть появились новые файлы).
Поскольку в скрипте не было оператора
exit
, значение$LastExitCode
было равно 1, что имеет смысл для Robocopy, но заставляет TFS полагать, что сценарий потерпит неудачу.С помощью
exit
подавил код выхода Robocopy, поэтому TFS считал, что сценарий сработал. Однако это означало, что любая Робокопическая информация подавлялась.Изменение последней строки на
exit ($LastExitCode -band 24)
решило проблему должным образом, согласноэтой статье .