将错误写入日志后退出脚本

时间:2015-07-23 18:38:05

标签: sql-server powershell error-handling

我正在编写一个脚本来将一堆sql文件部署到sql server。 要求是:

  1. 应将所有内容写入日志文件
  2. 脚本应该在遇到错误时结束(逻辑是我们修复它然后再次重新运行脚本)。
  3. 我有一个从文件夹中运行一堆sql文件的函数。

    function writeLog($comment,
                      $logfile="C:\Users\ndefontenay\Documents\Releases\logs\release-update.log"){
        $date=Get-Date -Format "MM/dd/yyyy HH:mm:ss"
        $fullComment="$date - $comment"
        $fullComment | Out-File -Append $logfile
    }
    
    function runQueriesInFolder($folder, $server=".",$database){
        Write-Host $folder
        $files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending
        foreach ($file in $files){
            invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536
        }
    }
    

    那很好。这会在控制台中退出并写入一些错误。但我需要记录错误,所以我使用try..catch。

    function runQueriesInFolder($folder, $server=".",$database){
        Write-Host $folder
        $files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending
        try{
            foreach ($file in $files){
                invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536
            }
        }
        catch{
            WriteLog("ERROR - $($_)")
        }
    }
    

    现在我的错误写在日志中,但脚本不再退出。所以我尝试使用“finally”语句。它似乎没有任何改善。

    function runQueriesInFolder($folder, $server=".",$database){
        Write-Host $folder
        $files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending
        try{
            foreach ($file in $files){
                invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536
            }
        }
        catch{
            WriteLog("ERROR - $($_)")
        }
        finally{
            exit 1
        }
    }
    

    在记录第一个错误时,错误日志应该已经结束无效的对象名称:

    07/23/2015 10:57:45 - ERROR - Invalid object name 'History.DOS.Test'.
    07/23/2015 10:57:45 - ERROR - Cannot open database "blah" requested by the login. The login failed.
    07/23/2015 10:57:45 - ERROR - The 'Query' and the 'InputFile' options are mutually exclusive.
    07/23/2015 10:57:45 - Release update completed
    

    所以问题是:如何让我的应用程序将停止错误记录到文件中,并完全退出脚本?

1 个答案:

答案 0 :(得分:2)

  

现在我的错误写在日志中,但脚本不再退出。

那是因为你的catch块正在处理错误,并且没有采取任何行动。

如果您想重新抛出错误,请执行以下操作:

catch{
    WriteLog("ERROR - $($_)")
    throw
}

现在您将记录错误,并且catch块将重新抛出错误以使其冒泡。

就错误“冒泡”而言,调用代码应该处理这个问题。调用代码可能希望相应地处理异常,或者它可以退出脚本。

# calling code
try {
    runQueriesInFolder(...)
}
catch {
    # hit an error, don't want to keep script running
    exit
}