Заставить PowerShell игнорировать код выхода?

Я использую robocopy в PowerShell, а robocopy возвращает код выхода 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

person Don Alcombright    schedule 10.02.2017    source источник
comment
См., например, этот вопрос.   -  person sodawillow    schedule 10.02.2017
comment
Зачем вам это нужно? Коды выхода из внешних команд не имеют значения для PowerShell, если вы явно не обрабатываете код выхода.   -  person Ansgar Wiechers    schedule 11.02.2017


Ответы (2)


Как указано выше, PowerShell не оценивает код ошибки собственной команды. Он сохраняет его только в $LastExitCode. Попробуйте этот простой пример:

Invoke-Expression 'cmd /c "exit 5"'

PowerShell хранит только 5 в $LastExitCode.

person Moerwald    schedule 12.02.2017

Я столкнулся с такой же ситуацией при использовании robocopy из сценария PowerShell, запущенного Jenkins; и в этом случае обязательно очищать LASTEXITCODE, потому что Jenkins проверяет его в конце задания, и ваше задание завершится ошибкой (за исключением, конечно, случая, когда вы иметь другую внешнюю команду, вызываемую после 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
}
person tibileo    schedule 07.07.2020