9

Invoke-Sqlcmdを使用してSQLServerへの接続に失敗すると、PowerShellでエラーをキャッチする際に問題が発生します。これは、問題を示すための一般的なコードです。

CLS
$server = "Localhost\fake"
try
{
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server
}
catch
{
    Write-Host "Error connecting to server " $server
}

次のエラーが発生します。

Invoke-Sqlcmd:SQLServerへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、およびSQLServerがリモート接続を許可するように構成されていることを確認してください。(プロバイダー:名前付きパイププロバイダー、エラー:40-SQL Serverへの接続を開くことができませんでした)

「サーバーLocalhost\fakeへの接続中にエラーが発生しました」という1行のステートメントを取得することを期待していました。

4

3 に答える 3

17

エラーは非終了と見なされるように見えますが、これは少し奇妙です。追加のパラメーターを使用して Invoke-SqlCommand を試してください: -ErrorAction Stop。エラーが終了しない場合、これにより、キャッチできる終了エラーに変換されます。

于 2012-11-28T17:13:31.967 に答える
3

コメントするには長すぎるため、@KeithHill による回答を補足する追加情報を回答として投稿します。

エラー レコードが Write-Error コマンドレットによって作成された場合、それは終了せず、-ErrorAction 引数または $ErrorActionPreference システム変数によって指定された動作に従います。throw を使用したエラーは終了しています。Write-Error (PowerShell 4.0 以下には、Web ページに記載されている -Exception パラメーターがないことに注意してください) およびPowerShell ヘルプ システムのabout_Throwのドキュメントを参照してください。

カスタム エラー情報を追加して終了エラーにする場合は、次のように catch ブロックからスローします。

catch
{
    throw (New-Object System.Exception "Error connecting to server $($server).", $_.Exception)
}

-ErrorAction 引数で指定されたとおりに終了を動作させたい場合は、Write-Error を使用できます。PowerShell 4.0 以下では、Write-Error コマンドレットは -Exception 引数を許可しないため、InnerException を提供しません。つまり、元の例外を特定する必要がある場合、呼び出し元は $Error システム変数のコレクションを調べる必要があります。Write-Error -Message "Some additional error information." -Exception $_.Exceptionそれ以降のバージョンでは、catch ブロックで使用できます。

于 2017-06-12T20:50:29.563 に答える
-2

試す

CLS
$server = "Localhost/fake"
try
{
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server
}
catch
{
    $_ | Out-Null
    Write-Host "Error connecting to server " $server
}

これにより、エラーがキャプチャされ、null にリダイレクトされ、書き込みホストが表示されます

于 2012-11-28T17:17:58.003 に答える