首页 > 解决方案 > Powershell 出错时恢复

问题描述

我在 powershell 脚本中有以下 foreach 循环:

foreach ($sqlScript in Get-ChildItem -path "$pathToScripts" -Filter *.sql | sort-object) {  
                Write-Host "Running Script " $sqlScript.Name

                #Execute the query
                switch ($removeComments) {
                    $true {
                        (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -replace '(?s)/\*.*?\*/', " " -split '\r?\n\s*go\s*\r\n?' -notmatch '^\s*$' |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                    }
                    $false {
                        (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -split '\r?\n\s*go\s*\r\n?' -notmatch '^\s*$' |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                    }
                }
            }

整个脚本用一个 catch/try 块包装,并且可以正常处理错误。

我现在有一个要求,如果其中一个文件(脚本)产生错误,循环将忽略它并继续下一个文件。

我可以使用嵌套的 catch try 块来执行此操作,还是有办法在错误时恢复循环?

标签: powershell

解决方案


添加一个额外的 Try..Catch 可能是要走的路。例如,您可以ForEach-Object按如下方式修改您的块:

Try {
    $SqlCmd.CommandText = $_.Trim(); 
    $reader = $SqlCmd.ExecuteNonQuery() 
} Catch {
    Write-Error "$($SqlCmd.CommandText) resulted in an error"
    $_
}

请注意,块$_Catch将包含发生的错误。执行后Catch,脚本的其余部分应照常进行。


推荐阅读