In Powershell Recupero del messaggio stampato da SSMS


12

Il nostro team DBA non verifica i backup utilizzando quanto segue TSQL(che può essere facilmente eseguito dopo il backup e non richiede quasi tempo, quindi non capisco perché no):

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

Hanno avuto problemi in passato, quindi anche se pensiamo che avrebbero imparato da esso, non lo hanno fatto. Ho creato uno script Powershell per farlo perché abbiamo circa 100 server e voglio solo eseguire questo script su tutti i backup solo per assicurarmi che siano validi. Lo script seguente viene eseguito correttamente (in quanto non si interrompe o genera errori), sono curioso di sapere se esiste un modo per recuperare il messaggio stampato in Powershell che normalmente verrebbe inserito in SSMS dove viene indicato Il set di backup nel file 1 è valido come verifica.

$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()
}

4
invoke-sqlcmd -verbose?
Aaron Bertrand

Invoke-SqlCmd ... -Verboseè utile anche se si desidera reindirizzare l'output per un uso successivo anziché stamparlo immediatamente sull'host.
Peter Vandivier,

Risposte:


19

Acquisizione dell'output di InfoMessage (PRINT, RAISERROR) da SQL Server mediante PowerShell

Il trucco, come sottolinea Jonathan, è che devi avere un ascoltatore collegato al gestore connessioni che ascolti le azioni di stampa o di errore.

$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  

Ho anche convogliato l'output dell'aggiunta di un parametro Out-Nullperché era un rumore di cui non avevo bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.