我的 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 输出。
奇怪的是,当我强制执行错误时,catch 会执行并且步骤会报告成功。
报错信息为:
任务 PowerShell 失败。这导致工作失败。查看日志
有关任务的更多详细信息。
TL;DR检查调用中使用的退出代码,或使用exit
离开
脚本。
RoboCopy http://ss64.com/nt/robocopy.html uses a suite of exit codes including:
0×00 0 未发生错误,未进行复制。
源目录树和目标目录树完全同步。
0×01 1 一个或多个文件复制成功(即新文件到达)。
(Full List Here http://ss64.com/nt/robocopy-exit.html)
因为剧本里没有exit
声明值$LastExitCode
为 1,这对于 Robocopy 有意义,但会导致 TFS 认为脚本失败。
Using exit
抑制了 Robocopy 退出代码,因此 TFS 相信该脚本已经起作用。然而,这意味着任何 Robocopy 信息都将被压制。
将最后一行更改为exit ($LastExitCode -band 24)
正确解决了问题,按照本文 https://gist.github.com/grenade/8686388.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)