No PowerShell, recuperando mensagem impressa do SSMS

12

Nossa equipe de DBA não verifica os backups usando o abaixo TSQL(o que pode ser feito facilmente após o backup e leva quase pouco tempo, por isso não entendo por que não):

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

Eles tiveram problemas no passado, então, mesmo que pensássemos que aprenderiam com isso, eles não tiveram. Criei um script do Powershell para fazer isso porque temos mais de 100 servidores e só quero executar esse script em todos os backups apenas para garantir que eles sejam válidos. O script abaixo é executado corretamente (na medida em que não quebra nem gera erros). Estou curioso para saber se há uma maneira de obter a mensagem impressa no Powershell que normalmente entraríamos no SSMS, onde diz O backup definido no arquivo 1 é válido como verificação.

$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
fonte
4
invoke-sqlcmd -verbose?
Aaron Bertrand
Invoke-SqlCmd ... -Verbosetambém é bom se você deseja redirecionar a saída para uso posterior, em vez de apenas imprimi-la no host imediatamente.
Peter Vandivier

Respostas:

19

Capturando a saída do InfoMessage (PRINT, RAISERROR) do SQL Server usando o PowerShell

O truque, como Jonathan aponta, é que você precisa ter um ouvinte conectado ao gerenciador de conexões para ouvir as ações de impressão ou erro.

$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  

Eu também canalizei a saída da adição de um parâmetro, Out-Nullpois esse era o ruído que eu não precisava.

billinkc
fonte