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 4

1 ответ:

TL; DR Проверьте коды выхода, используемые в вызовах, или используйте exit, чтобы покинуть скрипт.


RoboCopy использует набор кодов выхода, включая:

0×00 0 ошибок не было, и копирование не производилось. Исходное и конечное деревья каталогов полностью синхронизированы.

0×01 1 один или несколько файлов были успешно скопированы (то есть появились новые файлы).

(Полный Список Здесь)

Поскольку в скрипте не было оператора exit, значение $LastExitCode было равно 1, что имеет смысл для Robocopy, но заставляет TFS полагать, что сценарий потерпит неудачу.

С помощью exit подавил код выхода Robocopy, поэтому TFS считал, что сценарий сработал. Однако это означало, что любая Робокопическая информация подавлялась.

Изменение последней строки на exit ($LastExitCode -band 24) решило проблему должным образом, согласноэтой статье .