捕获在PowerShell中不同SQLCMD退出码进行连接/数据问题(Capturing in Po

2019-10-17 01:30发布

我从PowerShell中调用SQLCMD执行的T-SQL脚本。 目前我使用“:在错误退出”退出脚本,如果存在因违反使用约束等,这是通过PowerShell的检测1 $ SqlcmdProcess.ExitCode处理的数据错误。

但是,如果有与数据库连接问题,SQLCMD还给出了1的的ExitCode有没有一种方法来设置:在错误退出码为1以外的东西吗? 我知道使用类似的:退出(选择2)要做到这一点,但我宁愿仍然使用:在错误,所以我不必重写剧本。

Answer 1:

你可以使用PowerShell中的出口关键字。 下面是一个例子

创建一个名为sqlcmdexit.ps1脚本,用类似如下:

$result = sqlcmd -S"missing" -d master -Q "select @@servername"
if ($result[1] -like "*Error Locating Server/Instance Specified*" -or $result[1] -like "*Could not open a connection to SQL Server*") {
    exit 99
}

调用脚本并观察存在的代码:

C:\Users\Public\bin>.\sqlcmdExit.ps1
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or instance-specific error has occurred while
 establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and i
f SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.

C:\Users\Public\bin>$LASTEXITCODE
99

我不知道的任何方式来设置默认的ExitCode。 使用开始处理你可以类似的东西:

$tempFile = [io.path]::GetTempFileName()
$exitCode = (Start-Process -FilePath "sqlcmd.exe" -ArgumentList @"
-S"missing" -d master -Q "select @@servername"
"@ -Wait -NoNewWindow -RedirectStandardOutput $tempFile -Passthru).ExitCode

if ($exitCode -eq 1) {
    $result = get-content $tempfile
    if ($result[1] -like "*Error Locating Server/Instance Specified*" -or $result[1] -like "*Could not open a connection to SQL Server*") {
        remove-item $tempFile
        Exit 99
    }
}
else {
    remove-item $tempfile
    Exit $exitCode
}


文章来源: Capturing in PowerShell different sqlcmd exitcode for connectivity/data issues