2015-06-11 2 views
1

У меня есть простой скрипт, чтобы удалить файл, я знаю, что это может быть более надежным, но здесь этоPowershell Logging Ошибки

$LogFile = ".\deleteRegPol.log" 

try 
{ 
    Remove-Item "c:\test\new text document.txt" -force 
    Add-Content $LogFile -Value "We ran the command" 
} 
catch [Exception] 
{ 
    Add-Content $LogFile -Value $_ 
} 
finally 
{ 
} 

Когда файл я пытаюсь удалить, не существует, я получаю ошибка в командной строке, но в моем файле журнала она говорит, что команда запущена. Это говорит мне, что исключение не было выброшено, что привело к потоку, идущему в блок catch. Почему нет?

ответ

2

PowerShell обычно не сгенерирует исключение при возникновении ошибки. Вместо этого он записывает запись в поток ошибок, который вы можете перенаправить. Чтобы заставить его бросить, есть два варианта. Одним из них является, чтобы установить глобальные настройки ошибки, чтобы остановить:

$ErrorActionPreference = "Stop" 

Другой установить параметр ErrorAction остановиться. Это поддерживается для командлетов, которые принимают так называемые общие параметры, которые Remove-Item делает:

Remove-Item "c:\test\new text document.txt" -force -EA "Stop" 

Чтобы перенаправить поток ошибок вы используете код 2:

Remove-Item "c:\test\new text document.txt" -Force 2>> $LogFile 

Это будет добавляемой ошибка в файл журнала. Запись не записывается в поток ошибок, если ваш параметр «Стоп». Он просто включен в исключение, которое выбрасывается.

+0

Дело не в том, что PowerShell обычно не генерирует исключений, но различает два типа ошибок: завершающие и не заканчивающиеся ошибки. Первый бросок, а второй - нет. Установив '-ErrorAction' или' $ ErrorActionPreference' 'Stop', вы инструктируете интерпретатор обрабатывать все ошибки как завершающие ошибки. –

Смежные вопросы