En Powershell Recuperando mensaje impreso de SSMS


12

Nuestro equipo de DBA no verifica las copias de seguridad usando lo siguiente TSQL(que se puede hacer fácilmente después de la copia de seguridad y casi no lleva tiempo, por lo que no entiendo por qué no):

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

Han tenido problemas en el pasado, por lo que aunque pensamos que aprenderían de ello, no lo han hecho. Creé un script de Powershell para hacer esto porque tenemos más de 100 servidores y solo quiero ejecutar este script en todas las copias de seguridad solo para asegurarme de que sean válidas. El siguiente script se ejecuta correctamente (en el sentido de que no se rompe ni arroja errores), tengo curiosidad por saber si hay una manera de recuperar el mensaje impreso en Powershell que normalmente obtendríamos en SSMS donde dice que el conjunto de copia de seguridad en el archivo 1 es válido como verificación

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

44
invoke-sqlcmd -verbose?
Aaron Bertrand

Invoke-SqlCmd ... -VerboseTambién es bueno si desea redirigir la salida para su uso posterior en lugar de simplemente imprimirla en el host de inmediato.
Peter Vandivier

Respuestas:


19

Capturando la salida de InfoMessage (PRINT, RAISERROR) de SQL Server usando PowerShell

El truco, como señala Jonathan, es que debe tener un oyente conectado al administrador de conexión para escuchar las acciones de impresión o error.

$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  

También canalicé la salida de agregar un parámetro Out-Nullya que era ruido que no necesitaba.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.