Ссылаясь на десятый совет Эда Уилсона "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'
Задание будет успешно выполнено, но если вы запустите его непосредственно в 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") }