W Powershell Pobieranie wydrukowanej wiadomości z SSMS

12

Nasz zespół DBA nie weryfikuje kopii zapasowych za pomocą poniższych TSQL(które można łatwo wykonać po utworzeniu kopii zapasowej i nie zajmuje prawie czasu, więc nie rozumiem, dlaczego nie):

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

W przeszłości mieli problemy, więc nawet gdybyśmy myśleli, że się z tego wyciągną, nie zrobią tego. Stworzyłem skrypt Powershell, aby to zrobić, ponieważ mamy około 100 serwerów i chcę uruchomić ten skrypt na wszystkich kopiach zapasowych, aby upewnić się, że są one prawidłowe. Poniższy skrypt działa poprawnie (w tym sensie, że nie psuje się ani nie rzuca błędów), jestem ciekawy, czy istnieje sposób na odzyskanie wydrukowanej wiadomości w Powershell, którą normalnie otrzymalibyśmy w SSMS, tam gdzie jest napisane, że zestaw kopii zapasowych w pliku 1 to ważny jako weryfikacja.

$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()
}
Pytanie3CPO
źródło
4
invoke-sqlcmd -verbose?
Aaron Bertrand
Invoke-SqlCmd ... -Verbosejest również przydatny, jeśli chcesz przekierować dane wyjściowe do późniejszego wykorzystania, zamiast po prostu wydrukować je natychmiast na hoście.
Peter Vandivier

Odpowiedzi:

19

Przechwytywanie danych wyjściowych InfoMessage (PRINT, RAISERROR) z SQL Server za pomocą PowerShell

Sztuczka, jak zauważa Jonathan, polega na tym, że do menedżera połączeń musi być podłączony odbiornik nasłuchujący działań drukowania lub błędów.

$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  

Potokowałem również wyjście dodawania parametru, Out-Nullponieważ to był hałas, którego nie potrzebowałem.

billinkc
źródło