2012-11-28 2 views
6

Invoke-Sqlcmdを使用してSQL Serverに接続できない場合、PowerShellでエラーをキャッチするときに問題が発生します。これは、問題を実証するためのいくつかの一般的なコードです:Powershell tr​​y Catch invoke-sqlcmd

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 : A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

私は、1行のステートメントを取得するために期待していた:「エラーがサーバーローカルホスト\偽への接続」を

+0

私はPowerShell v3を使用しています。コードでカスタムエラーが発生します。 –

+0

またpowershell v2で –

+0

ありがとう、知っておいて、私は明らかにまだ2になっています。 –

答えて

8

エラーは少し終わっていないと考えられます。 Invoke-SqlCommandを追加のパラメータ、-ErrorAction Stopで試してください。エラーが終了していない場合は、これを捕捉できる終了エラーに変換します。

+0

そのように見えます、ありがとう。 –

-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 
} 

はこのエラーをキャプチャします試してみて、ヌル、それは長すぎるので、答えとして@KeithHillで答えを補完する追加情報を投稿あなたの書き込みホスト

+0

最後の行の最後に余分な}があると思います。私はこれを試して、私はまだエラーがあります。 –

2

を表示するには、それをリダイレクトコメントのために。

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引数。 PowerShell 4.0以降では、Write-Errorコマンドレットは-Exception引数を許可しないため、InnerExceptionを提供しません。つまり、元の例外を判断する必要がある場合、呼び出し元は$ Errorシステム変数でコレクションを調べなければなりません。それ以降のバージョンでは、catchブロックでWrite-Error -Message "Some additional error information." -Exception $_.Exceptionを使用できます。