Как отловить ошибку из Remove-Item и вместо этого выдать предупреждение? - PullRequest
0 голосов
/ 26 сентября 2019

В сценарии после развертывания, используемом в конвейере непрерывной интеграции (DevOps Azure), я удаляю старые файлы.

По сути, это сценарий PowerShell, который удаляет все папки выпуска, кроме текущей в папке.каталог развертывания.

Иногда по какой-то причине происходит сбой Remove-Item (например, старый файл все еще открывается кем-то на машине деплиомента)

Это не имеет большого значения.Я не хочу, чтобы из-за этого произошла ошибка всего развертывания.Однако мне нужно предупреждение, поэтому я знаю, что это произошло.

Например (MCVE):

Remove-Item INEXISTENT_FILE

Проблема : это вызывает ошибку.


Попытка 1:

Remove-Item INEXISTENT_FILE -ErrorAction SilentlyContinue

Проблема : Это полностью устраняет ошибку, это не то, что я хочу (я хочу предупреждение)


Попытка 2: я пытался использовать ErrorVariable, как рекомендовано здесь: https://devblogs.microsoft.com/powershell/erroraction-and-errorvariable/

Remove-Item INEXISTENT_FILE -ErrorAction SilentlyContinue -ErrorVariable $removeItemError
if ($removeItemError) {
    Write-Warning "Warning, something failed!"
}

Проблема : не работает, не отображается if часть.Если я удаляю действие ошибки SilentlyContinue, оно просто выдает ошибку и ни в коем случае не переходит в часть if.


Попытка 3: я пытался использовать также блок Try Catch, как было предложеноздесь: PowerShell -ErrorAction SilentlyContinue Не работает с Get-ADUser

Try {
    Remove-Item INEXISTENT_FILE
}
Catch {
    Write-Warning "Warning, something failed!"
}

Проблема : он также никогда не входит в блок catch (!?)


У кого-нибудь есть другой вариант, чтобы вместо предупреждения выводить предупреждение вместо ошибки?

1 Ответ

3 голосов
/ 26 сентября 2019

Ошибка, выдаваемая Remove-Item, считается «не прекращающейся», что означает, что она игнорируется командой «try / catch».Чтобы заставить его становиться «видимым» для «попробовать / поймать», используйте параметр ErrorAction:

Remove-Item INEXISTENT_FILE -ErrorAction Stop

В качестве альтернативы, вы можете изменить это на уровне сценария (то есть для всехпоследующие команды), как это:

$ErrorActionPreference = 'Stop'

...