Dalam Powershell Mengambil Pesan Cetak Dari SSMS

12

Tim DBA kami tidak memverifikasi cadangan menggunakan di bawah ini TSQL(yang dapat dengan mudah dilakukan pasca-cadangan dan hampir tidak memerlukan waktu, jadi saya tidak mengerti mengapa tidak):

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

Mereka memiliki masalah di masa lalu, jadi meskipun kami pikir mereka akan belajar dari itu, mereka belum. Saya membuat skrip Powershell untuk melakukan ini karena kami memiliki sekitar 100 server dan saya hanya ingin menjalankan skrip ini terhadap semua cadangan hanya untuk memastikan mereka valid. Script di bawah ini berjalan dengan benar (dalam hal itu tidak memecahkan atau melempar kesalahan), saya ingin tahu apakah ada cara untuk mendapatkan pesan yang dicetak kembali di Powershell yang biasanya kita dapatkan di SSMS di mana ia menyatakan Set cadangan pada file 1 adalah valid sebagai verifikasi.

$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()
}
Pertanyaan3CPO
sumber
4
invoke-sqlcmd -verbose?
Aaron Bertrand
Invoke-SqlCmd ... -Verbosejuga bagus jika Anda ingin mengarahkan output untuk digunakan nanti daripada hanya mencetaknya ke host segera.
Peter Vandivier

Jawaban:

19

Menangkap Output InfoMessage (PRINT, RAISERROR) dari SQL Server menggunakan PowerShell

Kuncinya, seperti yang ditunjukkan Jonathan, adalah Anda harus memiliki pendengar yang terhubung dengan manajer koneksi mendengarkan tindakan cetak atau kesalahan.

$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  

Saya juga menyalurkan output untuk menambahkan parameter Out-Nullkarena itu adalah noise yang tidak saya butuhkan.

billinkc
sumber