In Powershell Abrufen gedruckter Nachrichten von SSMS

12

Unser DBA-Team überprüft die Sicherungen nicht anhand der folgenden Informationen TSQL(was einfach nach der Sicherung durchgeführt werden kann und fast keine Zeit in Anspruch nimmt, daher verstehe ich nicht, warum nicht):

RESTORE VERIFYONLY
FROM DISK = 'D:\Backups\LOCATION'

Sie hatten in der Vergangenheit Probleme, und obwohl wir glauben, dass sie daraus lernen würden, haben sie es nicht getan. Ich habe dazu ein Powershell-Skript erstellt, da wir über 100 Server haben und ich dieses Skript nur für alle Sicherungen ausführen möchte, um sicherzustellen, dass sie gültig sind. Das folgende Skript wird korrekt ausgeführt (da es keine Fehler verursacht oder auslöst). Ich bin gespannt, ob es eine Möglichkeit gibt, die gedruckte Nachricht in Powershell zurückzugewinnen, die wir normalerweise in SSMS erhalten würden, wo es heißt, dass das in Datei 1 festgelegte Backup lautet gültig als Verifikation.

$SqlCon = New-Object System.Data.SqlClient.SqlConnection
$SqlCon.ConnectionString = "SERVER=SERV\INST;Integrated Security=true;DATABASE=master"

$baks = Get-ChildItem "D:\Backups\" -Filter *.BAK

foreach ($bak in $baks)
{
    $SqlCon.Open()
    $cd = New-Object System.Data.SqlClient.SqlCommand
    $cd.Connection = $SqlCon

    $cd.CommandText = "RESTORE VERIFYONLY FROM DISK = @f"
    $cd.Parameters.Add("@f", $bak.FullName)
    $cd.ExecuteNonQuery()
    $SqlCon.Close()
}
Frage3CPO
quelle
4
invoke-sqlcmd -verbose?
Aaron Bertrand
Invoke-SqlCmd ... -VerboseDies ist auch hilfreich, wenn Sie die Ausgabe zur späteren Verwendung umleiten möchten, anstatt sie sofort auf den Host zu drucken.
Peter Vandivier

Antworten:

18

Erfassen der InfoMessage-Ausgabe (PRINT, RAISERROR) von SQL Server mit PowerShell

Der Trick besteht, wie Jonathan betont, darin, dass an den Verbindungsmanager ein Listener angeschlossen sein muss, der auf die Druck- oder Fehleraktionen wartet.

$cd.Parameters.Add("@f", $bak.FullName) | Out-Null
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Host $event.Message }
$SqlCon.add_InfoMessage($handler)
$SqlCon.FireInfoMessageEventOnUserErrors = $true  

Ich habe auch die Ausgabe des Hinzufügens eines Parameters weitergeleitet, Out-Nullda dies Rauschen war, das ich nicht brauchte.

billinkc
quelle