Dans Powershell, récupération du message imprimé à partir de SSMS


12

Notre équipe DBA ne vérifie pas les sauvegardes à l'aide de ce qui suit TSQL(ce qui peut facilement être effectué après la sauvegarde et ne prend presque pas de temps, donc je ne comprends pas pourquoi):

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

Ils ont eu des problèmes dans le passé, donc même si nous pensons qu'ils en tireraient des leçons, ils ne l'ont pas fait. J'ai créé un script Powershell pour ce faire car nous avons environ 100+ serveurs et je veux juste exécuter ce script sur toutes les sauvegardes juste pour m'assurer qu'elles sont valides. Le script ci-dessous fonctionne correctement (dans la mesure où il ne casse pas ou ne génère pas d'erreurs), je suis curieux de savoir s'il existe un moyen de récupérer le message imprimé dans Powershell que nous aurions normalement dans SSMS où il indique Le jeu de sauvegarde sur le fichier 1 est valable comme vérification.

$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 ... -Verboseest également pratique si vous souhaitez rediriger la sortie pour une utilisation ultérieure au lieu de simplement l'imprimer immédiatement sur l'hôte.
Peter Vandivier

Réponses:


19

Capture de la sortie d'InfoMessage (PRINT, RAISERROR) à partir de SQL Server à l'aide de PowerShell

L'astuce, comme le souligne Jonathan, est que vous devez avoir un écouteur attaché au gestionnaire de connexions pour écouter les actions d'impression ou d'erreur.

$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  

J'ai également canalisé la sortie de l'ajout d'un paramètre Out-Nullcar c'était du bruit dont je n'avais pas besoin.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.