【问题标题】:exit script after writing error to log将错误写入日志后退出脚本
【发布时间】:2015-07-23 18:38:05
【问题描述】:

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

  1. 所有内容都应写入日志文件
  2. 脚本在遇到错误时应该结束(逻辑是我们修复它然后重新运行脚本)。

我有一个函数可以从一个文件夹中运行一堆 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

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

【问题讨论】:

    标签: sql-server powershell error-handling


    【解决方案1】:

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

    那是因为您的 catch 块正在处理错误并且不采取任何措施。

    如果你想重新抛出错误,那么就这样做:

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

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

    至于“冒泡”错误,调用代码应该处理这个问题。调用代码可能想要相应地处理异常,或者它可能只是退出脚本。

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

    【讨论】:

    • 将出口放在“catch”中。 >
    猜你喜欢
    • 2015-07-02
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多