簡體   English   中英

如何使用 output 和退出代碼運行 SQL 服務器代理 Powershell 腳本

[英]How to run SQL Server Agent Powershell script with output and exit code

我正在嘗試將 PowerShell 腳本作為 SQL Server 2016 代理作業運行。

當我的 Powershell 腳本運行時,我正在使用“Write-Output”生成幾行 output。 我想將這個 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);
}

在“高級”設置下,選中“在歷史記錄中包含步驟 output”。 如果我從 PowerShell 腳本中刪除最后的“if”語句,那么我可以在歷史記錄中看到 output,但作業步驟總是成功並繼續下一步。 如果我包含 if/else 語句,如果 $resultState 不等於“SUCCESS”(這是我想要的),作業步驟將失敗,但我在作業步驟的歷史記錄中再也看不到我的 output。

有什么建議么?

我通過將所有輸出行保存到單個變量來解決這個問題,如果我的結果不是我想要的,則使用Write-Error-ErrorAction Stop 這是不太我試圖在第一個這樣做,因為這不使用退出代碼,但SQL Agent將正確地檢測,如果作業步驟成功與否,我的輸出還可以在作業歷史,因為露面它將包含在錯誤消息中。

更新代碼:

# 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 作業 Powershell 步驟中記錄的 output 非常無用。 我發現最好使用調用 Powershell.exe 的 CmdExex 步驟。

在 Sql 2019 CmdExec 作業步驟中,您可以像這樣調用 powershell 腳本:

Powershell "F:\Temp\TestScript.ps1"

...你會得到所有的 output(如果你願意,你可以將它記錄到一個文件中)。 如果出現錯誤,作業會正常停止。

在 SQL 服務器的某些早期版本中,會記錄 Powershell 錯誤,但作業會繼續運行(請參閱此處https://stackoverflow.com/a/53732722/22194 ),因此您需要將腳本包裝在 try/catch 中以 SQL 可以處理的方式冒出錯誤:

Powershell.exe -command "try { & 'F:\Temp\TestScript.ps1'} catch { throw $_ }"

請注意,如果您的腳本路徑中有空格,您可能會遇到不同的問題,請參閱此處https://stackoverflow.com/a/45762288/22194

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM