如何 运行 SQL Server Agent Powershell 脚本与输出和退出代码
How to run SQL Server Agent Powershell script with output and exit code
我正在尝试 运行 PowerShell 脚本作为 SQL Server 2016 代理作业。
作为我的 Powershell 脚本 运行,我正在使用 "Write-Output" 生成几行输出。我想将此输出保存到作业历史记录中,并且我只希望作业在 PowerShell 脚本 运行 完成且退出代码为 0 时继续下一步。
我在代理作业中使用 "PowerShell" 步骤类型。命令文本如下所示..
# Does some stuff that eventually sets the $resultState variable...
Write-Output ("Job complete with result '" + $resultState + "'")
if($resultState -eq "SUCCESS") {
[Environment]::Exit(0);
}
else {
[Environment]::Exit(1);
}
在"Advanced"设置下,勾选了"Include step output in history"。如果我从 PowerShell 脚本中删除最后的 "if" 语句,那么我可以在历史记录中看到输出,但作业步骤总是成功并继续下一步。如果我包含 if/else 语句,如果 $resultState 不等于 "SUCCESS"(这是我想要的),作业步骤将失败,但我在作业步骤的历史记录中再也看不到我的输出.
有什么建议吗?
我通过将所有输出行保存到一个变量来解决这个问题,如果我的结果不是我想要的,则使用 Write-Error
和 -ErrorAction Stop
。这不是 完全 我一开始想做的,因为这不使用退出代码,但 SQL 代理将正确检测作业步骤是否成功或不会,而且我的输出仍然可以显示在作业历史记录中,因为它将包含在错误消息中。
更新代码:
# Does some stuff that sets the $resultState and saves output lines to $output...
$output += "`r`nJob complete with result '$resultState'"
if($resultState -eq "SUCCESS") {
Write-Output ($output)
}
else {
Write-Error ("`r`n" + $output) -ErrorAction Stop
}
我为此苦苦挣扎。 Sql Job Powershell 步骤的记录输出非常无用。我发现最好使用 CmdExex 步骤来代替调用 Powershell.exe.
在 Sql 2019 CmdExec 作业步骤中,您可以像这样调用您的 powershell 脚本:
Powershell "F:\Temp\TestScript.ps1"
... 您将获得所有输出(如果您愿意,可以将其记录到文件中)。如果出现错误,作业会正确停止。
在 SQL 服务器的某些早期版本中,Powershell 错误会被记录下来,但作业会继续 运行(请参阅此处 ),因此您需要包装脚本在 try/catch 中以 SQL 可以处理的方式冒出错误:
Powershell.exe -command "try { & 'F:\Temp\TestScript.ps1'} catch { throw $_ }"
请注意,如果您的脚本路径中有空格,您可能会遇到不同的问题,请参阅此处
我正在尝试 运行 PowerShell 脚本作为 SQL Server 2016 代理作业。
作为我的 Powershell 脚本 运行,我正在使用 "Write-Output" 生成几行输出。我想将此输出保存到作业历史记录中,并且我只希望作业在 PowerShell 脚本 运行 完成且退出代码为 0 时继续下一步。
我在代理作业中使用 "PowerShell" 步骤类型。命令文本如下所示..
# Does some stuff that eventually sets the $resultState variable...
Write-Output ("Job complete with result '" + $resultState + "'")
if($resultState -eq "SUCCESS") {
[Environment]::Exit(0);
}
else {
[Environment]::Exit(1);
}
在"Advanced"设置下,勾选了"Include step output in history"。如果我从 PowerShell 脚本中删除最后的 "if" 语句,那么我可以在历史记录中看到输出,但作业步骤总是成功并继续下一步。如果我包含 if/else 语句,如果 $resultState 不等于 "SUCCESS"(这是我想要的),作业步骤将失败,但我在作业步骤的历史记录中再也看不到我的输出.
有什么建议吗?
我通过将所有输出行保存到一个变量来解决这个问题,如果我的结果不是我想要的,则使用 Write-Error
和 -ErrorAction Stop
。这不是 完全 我一开始想做的,因为这不使用退出代码,但 SQL 代理将正确检测作业步骤是否成功或不会,而且我的输出仍然可以显示在作业历史记录中,因为它将包含在错误消息中。
更新代码:
# Does some stuff that sets the $resultState and saves output lines to $output...
$output += "`r`nJob complete with result '$resultState'"
if($resultState -eq "SUCCESS") {
Write-Output ($output)
}
else {
Write-Error ("`r`n" + $output) -ErrorAction Stop
}
我为此苦苦挣扎。 Sql Job Powershell 步骤的记录输出非常无用。我发现最好使用 CmdExex 步骤来代替调用 Powershell.exe.
在 Sql 2019 CmdExec 作业步骤中,您可以像这样调用您的 powershell 脚本:
Powershell "F:\Temp\TestScript.ps1"
... 您将获得所有输出(如果您愿意,可以将其记录到文件中)。如果出现错误,作业会正确停止。
在 SQL 服务器的某些早期版本中,Powershell 错误会被记录下来,但作业会继续 运行(请参阅此处 ),因此您需要包装脚本在 try/catch 中以 SQL 可以处理的方式冒出错误:
Powershell.exe -command "try { & 'F:\Temp\TestScript.ps1'} catch { throw $_ }"
请注意,如果您的脚本路径中有空格,您可能会遇到不同的问题,请参阅此处