Как показать ошибку в шаге PowerShell, вызываемом из задания SQL Server 2008 R2? - PullRequest
10 голосов
/ 02 февраля 2012

Я искал в Интернете, но не нашел очень много. На самом деле, большая часть информации была здесь о стековом потоке - Показать ошибку для задания SQL 2005, которое выполняет сценарий Powershell через приглашение CMD, если сценарий PS PS завершается с ошибкой , но я надеюсь, что это с SQL Server 2005 в 2008 году ситуация улучшилась.

В любом случае, я хочу, чтобы у агента SQL Server было задание FAIL в случае сбоя сценария Powershell. В SQL Server я использую шаг powershell, только с этим:

write-output "this is a test error"
exit -1

Я думал, что это приведет к ошибке задания SQL Server, но это не происходит, это показывает, успешно. Необходимо ли использовать шаг cmdexec, а затем выполнить оболочку для powershell, чтобы можно было получать ошибки при их возникновении?

спасибо, Sylvia

Ответы [ 4 ]

12 голосов

Ссылаясь на десятый совет Эда Уилсона "10. Обработка ошибок Windows Powershell в заданиях агента SQL Server" из " 10 Советы для сценария SQL Server PowerShell ":

10.Обработка ошибок Windows Powershell в заданиях агента SQL Server

По умолчанию для параметра ErrorActionPreference задано значение Продолжить, и это влияет на то, как ошибки передаются на сервер заданий SQL Server.Если вы запускаете команду Windows PowerShell как задание агента SQL Server и синтаксических ошибок еще нет, команда выдает ошибку (например, при попытке получить информацию об операционной системе с недоступного сервера).Задание агента SQL Server сообщит об успешном выполнении.Если вы хотите, чтобы условие ошибки останавливало выполнение задания агента SQL Server или вызывало ошибку, вам необходимо добавить некоторую обработку ошибок.Задание агента SQL Server можно настроить с помощью шага задания Windows PowerShell следующим образом:

get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'

PS return error from SqlServerAgent job

Задание будет успешно выполнено, но если вы запустите его непосредственно в Windows PowerShellвы увидите:

get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'
get-wmiobject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

At line:1 char:1

  + get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'

Чтобы вывести ошибки Windows PowerShell в агент SQL Server, вам необходимо выполнить одно из следующих действий:

A.Установите $ ErrorActionPreference = "Stop"

  $erroractionpreference = "Stop"
  get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'

B.Установите ErrorAction на уровне командлета (более детально)

   get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'  -ErrorAction 'Stop'

C.Используйте Try / Catch с ErrorActionPreference или ErrorAction

try 
{  
  get-wmiobject Win32_OperatingSystem -ComputerName 'nothere' -ErrorAction 'Stop'  

}  
catch 
{   
  throw "Something went wrong"  
  #or rethrow error  
  #throw $_  
  #or throw an error no message  
  #throw  
}  

D.Продолжайте и не выполняйте задание агента SQL Server

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

  #Note the -ErrorVariable parameter takes a variable name without the $ prefix.
  get-wmiobject Win32_OperatingSystem -ComputerName 'localhost','nothere','Win7boot' -ErrorVariable myError

  if ($myError)
  { throw ("$myError") }
3 голосов
/ 02 февраля 2012

Я добавляю строку в Write-Error с ErrorAction, установленным для остановки, если я хочу, чтобы шаг задания Powershell возвращал ошибку. Это только одна строка. Write-Error "Job Failure" -EA Stop

1 голос
/ 01 октября 2013

Я также успешно завершил этап задания SQL с помощью следующего кода:

    if (!$files) 
    {THROW 'Throw Error: the backup directory was empty!'; "%errorlevel%"} 

Это использовалось для проверки наличия файлов в каталоге ($ files), а затем для выбросаошибка, если пустая.Он вернет пользовательский THROW и вернет код завершения PowerShell (через% errorlevel%), в результате чего ваша задача вернет ошибку в сеанс агента SQL, выполняющего работу, и завершит работу на этом шаге.

0 голосов
/ 12 декабря 2018

Если вы используете шаг «CmdExec» вместо шага «PowerShell» (который вы должны из-за версий PowerShell ), у меня сработал следующий синтаксис:

powershell.exe -command "try { & 'D:\BadScript.ps1'} catch { throw $_ }"

(из Джоэл Грейер ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...