我的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/