В Powershell Получение печатного сообщения из SSMS

12

Наша команда администраторов баз данных не проверяет резервное копирование, используя приведенное ниже TSQL(что легко сделать после резервного копирования и почти не занимает времени, поэтому я не понимаю, почему нет):

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

У них были проблемы в прошлом, поэтому, хотя мы думаем, что они извлекут из этого уроки, у них их нет. Для этого я создал скрипт Powershell, потому что у нас более 100 серверов, и я просто хочу запустить этот скрипт для всех резервных копий, чтобы убедиться, что они действительны. Приведенный ниже сценарий работает правильно (в том смысле, что он не ломает и не выдает ошибки). Мне интересно, есть ли способ вернуть напечатанное сообщение в Powershell, которое мы обычно получаем в SSMS, где указано состояние Резервный набор в файле 1: действителен как подтверждение.

$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()
}
Question3CPO
источник
4
invoke-sqlcmd -verbose?
Аарон Бертран
Invoke-SqlCmd ... -VerboseТакже хорошо, если вы хотите перенаправить вывод для последующего использования, а не просто распечатать его на хосте немедленно.
Питер Вандивье

Ответы:

19

Получение вывода InfoMessage (PRINT, RAISERROR) из SQL Server с помощью PowerShell

Хитрость, как отмечает Джонатан, заключается в том, что необходимо подключить прослушиватель к диспетчеру соединений, который прослушивает действия печати или ошибки.

$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  

Я также передал результат добавления параметра, так Out-Nullкак это был шум, который мне не нужен.

billinkc
источник