2012-11-28 56 views
6

我遇到問題,當連接失敗時使用Invoke-Sqlcmd在SQL Server上捕獲PowerShell中的錯誤。這是一些通用的代碼來說明這個問題:Powershell嘗試捕獲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)

我期待得到一個行語句:「錯誤連接到服務器localhost \假冒」

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

這將捕獲錯誤,並將其重定向到空,顯示您寫的主機

+0

我想你在第二行到最後一行的末尾有一個額外的}。我試過這個,我仍然有錯誤。 –

2

發佈其他信息由@KeithHill的回答爲補充的答案,因爲它是太長作爲評論。

如果錯誤記錄是由Write-Error命令行創建的,則它不是終止的並且受到-ErrorAction參數或$ ErrorActionPreference系統變量指定的行爲的限制。使用throw的錯誤正在終止。請參閱Write-Error的文檔(請注意,PowerShell 4.0及更低版本沒有在網頁中提到的-Exception參數。)和about_Throw在PowerShell幫助系統中。

如果你想添加自定義錯誤信息,並使其終止錯誤,從catch塊拋出如下:

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

您可以使用寫入錯誤,如果你希望由指定的終止行爲-ErrorAction參數。在PowerShell 4.0及更低版本中,Write-Error commandlet不允許使用-Exception參數,因此不會提供InnerException。這意味着調用者必須檢查$ Error系統變量中的集合是否需要確定原始異常。在以後的版本中,您可以在您的catch塊中使用Write-Error -Message "Some additional error information." -Exception $_.Exception