Агент SQL-сервера не сообщает об ошибке из-за необработанного исключения в сценарии PowerShell

Я настроил задание агента SQL-сервера с несколькими шагами, которые необходимо обрабатывать каждую неделю. Одним из них является сценарий PowerShell, который выдает следующее (неперехваченное) пользовательское исключение:

$endfile = Test-Path "C:\Temp\1_${loc}_${lastpayweek}.csv"
IF ($endfile -eq $true) 
{
   throw "target file already exists"
}

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

Я вызываю скрипт PowerShell следующим образом:

powershell C:\scripts\rename_timesheet_export.ps1 -loc 3

Почему сообщается об успехе?


person defect833    schedule 22.01.2014    source источник


Ответы (2)


Вам нужно установить $ErrorActionPreference для остановки:

$ErrorActionPreference = "Стоп"

По умолчанию установлено значение «Продолжить», поэтому при вызове Powershell из агента SQL задание будет продолжено при ошибке, если вы не измените этот параметр.

У меня есть еще несколько советов по вызову Powershell из агента SQL здесь: http://blogs.technet.com/b/heyscriptingguy/archive/2013/05/06/10-tips-for-the-sql-server-powershell-scripter.aspx< /а>

person Chad Miller    schedule 22.01.2014
comment
Я изменил свое выполнение, чтобы попробовать { powershell C:\scripts\export_timesheet_csv.ps1 -loc 3 -locid 102 -ErrorAction 'Stop'} catch { throw $_ } и внутри скрипта, сразу после получения параметров командной строки, я бросаю исключение. Я получаю тот же сценарий, когда задание сообщает об успехе, но в истории отмечается, что произошло исключение. - person defect833; 23.01.2014
comment
Кажется странным, что вы вызываете powershell.exe на этапе задания sqlps? - person Chad Miller; 24.01.2014
comment
Я удалил вызов powershell.exe из начала оператора выполнения, и он начал правильно сообщать об ошибках. Похоже, что он делал вызов powershell в вызове powershell (задание SQL), и исключения не передавались полностью. - person defect833; 28.01.2014
comment
Обработка ошибок в Powershell поначалу требует некоторого привыкания. Блоки try/catch требуют, чтобы вы установили действия при ошибках, а также не работают с командами устаревшего типа (exe). Традиционные приложения командной строки устанавливают коды выхода. - person Chad Miller; 29.01.2014
comment
@ChadMiller Я обнаружил, что мне пришлось вызывать powershell.exe на этапе задания sqlps, потому что версия powershell в SQL — 2.0, и я хотел использовать команду invoke-command, которая является командлетом 3.0. - person Arluin; 11.09.2014

Это ваш ответ:

Почему мои коды выхода powershell всегда равны 0?

многие говорят, что использование -file является проблемой, но похоже, что это не так

person Nick.McDermaid    schedule 22.01.2014