我在PowerShell中使用robocopy
,如果文件成功复制,robocopy
会返回一个exitcode 1,这会告诉PowerShell它失败了。是否有一个很好的做法可以忽略错误,因为它不是错误?
$source = "$env:buildlocation\Reports\$env:ctrelname\DiskImages\DISK1";
$target = "$env:builddestination\$env:ctrelver\$env:ctrelname\Reports";
$robocopyOptions = @('/e', '/r:0', '/np');
Get-ChildItem -Path $source -Directory -Attributes !Hidden |
Sort-Object -Property CreationTime |
ForEach-Object { & robocopy.exe $source $target $robocopyOptions };
echo $LASTEXITCODE
答案 0 :(得分:0)
如上所述,PowerShell不会评估本机命令的错误代码。它只将其存储在$LastExitCode
中。试试这个简单的例子:
Invoke-Expression 'cmd /c "exit 5"'
PowerShell仅在$LastExitCode
中存储5个。
答案 1 :(得分:0)
在 Jenkins 运行的 PowerShell 脚本中使用 robocopy 时,我遇到了相同的情况;并且在这种情况下,强制性清除 LASTEXITCODE 是强制性的,因为詹金斯会在工作结束时进行检查,并且您的工作将会失败(当然,如果您在 robocopy 之后还有另一个外部命令被调用,它清除了最后一个退出代码。
我使用了以下代码:
$initialExitCode = $global:LASTEXITCODE
Invoke-Expression "robocopy ..."
# See robocopy exit codes: if it's less than 8, there should be no terminal error
if (($initialExitCode -eq 0 -or [string]::IsNullOrWhiteSpace($initialExitCode)) -and $LASTEXITCODE -le 7) {
$global:LASTEXITCODE = 0
}