在 Powershell 中从 SSMS 检索打印的消息

Que*_*CPO 12 sql-server powershell

我们的 DBA 团队不会使用以下方法验证备份TSQL(备份后可以轻松完成并且几乎不需要时间,所以我不明白为什么不这样做):

RESTORE VERIFYONLY
FROM DISK = 'D:\Backups\LOCATION'
Run Code Online (Sandbox Code Playgroud)

他们过去曾遇到过问题,所以即使我们认为他们会从中吸取教训,但他们没有。我创建了一个 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()
}
Run Code Online (Sandbox Code Playgroud)

bil*_*nkc 20

使用 PowerShell 从 SQL Server 捕获 InfoMessage 输出(PRINT、RAISERROR)

正如 Jonathan 指出的那样,诀窍是您需要将一个侦听器附加到连接管理器上,以侦听打印或错误操作。

$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  
Run Code Online (Sandbox Code Playgroud)

我还通过管道将添加参数的输出传输到了,Out-Null因为这是我不需要的噪音。