$ LASTEXITCODE предназначен только для программ командной строки, чтобы вернуть их статус. Командлеты, встроенные в PS, такие как Remove-item, возвращают свои ошибки до 3-х способов. Для предупреждений они пишут сообщения (или другие объекты .NET) в «предупреждающий поток». В PSv3 существует простой способ перенаправить этот поток в файл: cmdlet blah blah blah 3>warning.out
. Второй - через поток ошибок. Этот поток также может быть перенаправлен ... 2>error.out
, или, чаще всего, ошибки пойманы с помощью try/catch или trap или записываются в переменную с параметром -ErrorVariable (см. help about_commonparameters
). Третий способ - «выбросить» ошибки. Если не поймать (try/catch или trap), заброшенная ошибка приведет к завершению работы скрипта. Брошенные ошибки обычно являются подклассами класса .NET system.Management.Automation.ErrorRecord
. ErrorRecord предоставляет намного больше информации об ошибке, чем код возврата.
Если remove-item завершился с ошибкой из-за ошибки, не найденной в файле, она записывает System.Management.Automation.ItemNotFoundException
в поток ошибок. Используя try/catch, вы можете фильтровать эту конкретную ошибку или другие конкретные ошибки из remove-item. Если вы просто вводите команды PS из командной строки, вы можете ввести $error[0]|select-object *
, чтобы получить много информации о последней ошибке.
Вы можете сделать это:
try {
Remove-Item -Recurse -Force C:\users\bkp 2>&1
} catch {
# oops remove-item failed. Write warning then quit
# replace the following with what you want to do
write-warning "Remove-item encounter error: $_"
return # script failed
}
Вы можете просто проверить переменную $ error. В нем содержится каждая ошибка, встречающаяся в вашей сессии, до некоторой степени, так как у нее есть ограничение на распределение памяти. –