我的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 + "\bin\release")
      $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{}

如果取消静音并使用/DEBUG,并且没有在TFS构建日志中捕获任何内容,则可以看到所有robocopy输出。

奇怪的是,当我强制执行错误时,捕获将执行并且该步骤将报告成功。

报告的错误消息是:

最佳答案

TL; DR 检查调用中使用的退出代码,或使用exit离开
脚本。

RoboCopy使用一套退出代码,包括:



(Full List Here)

由于脚本没有exit语句,因此$LastExitCode的值为1,这对于Robocopy有意义,但会导致TFS认为脚本失败。

使用exit替代了Robocopy退出代码,因此TFS认为该脚本可以正常工作。但是,这意味着任何Robocopy信息都被抑制了。

根据this article,将最后一行更改为exit ($LastExitCode -band 24)可以正确解决此问题。

关于powershell - TFS Build PowerShell步骤中的Robocopy报告失败但没有错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32340852/

10-13 06:01