【问题标题】:SQL server agent not reporting failure from uncaught exception in PowerShell scriptSQL Server 代理未报告 PowerShell 脚本中未捕获的异常导致的失败
【发布时间】:2014-02-12 01:31:12
【问题描述】:

我设置了一个 SQL Server 代理作业,其中包含每周需要处理的几个步骤。其中之一是一个 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

为什么报告为成功?

【问题讨论】:

    标签: sql sql-server powershell error-handling sql-server-agent


    【解决方案1】:

    您需要将 $ErrorActionPreference 设置为停止:

    $ErrorActionPreference = "停止"

    默认设置为继续,因此当从 SQL 代理调用 Powershell 时,除非您更改设置,否则作业将继续出错。

    我还有一些关于从 SQL 代理调用 Powershell 的提示: http://blogs.technet.com/b/heyscriptingguy/archive/2013/05/06/10-tips-for-the-sql-server-powershell-scripter.aspx

    【讨论】:

    • 我将执行更改为尝试 { powershell C:\scripts\export_timesheet_csv.ps1 -loc 3 -locid 102 -ErrorAction 'Stop' } catch { throw $_ } 并在脚本内部,在收到后立即命令行参数,我抛出异常。我遇到了同样的情况,工作报告成功,但在历史记录中指出发生了异常。
    • 在 sqlps 作业步骤中调用 powershell.exe 似乎很奇怪?
    • 我从执行语句的前面删除了 powershell.exe 调用,它开始正确报告错误。似乎它是在 powershell(SQL 作业)调用中进行 powershell 调用,并且异常没有一直传递。
    • 最初使用 Powershell 处理错误需要一点时间来适应。 try/catch 块需要您设置错误操作,并且也不适用于传统(exe)类型的命令。传统的命令行应用设置退出代码。
    • @ChadMiller 我发现我必须在 sqlps 作业步骤中调用 powershell.exe,因为 SQL 中的 powershell 版本是 2.0,我想使用 3.0 cmdlet 的调用命令。
    【解决方案2】:

    这是你的答案吗:

    Why are my powershell exit codes always "0"?

    很多事情都说使用-file 是问题,但看起来你不是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多