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


12

我们的DBA团队不会使用以下方法来验证备份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()
}

4
invoke-sqlcmd -verbose
亚伦·伯特兰

Invoke-SqlCmd ... -Verbose如果您想重定向输出以供以后使用,而不是仅将其立即打印到主机,也很好。
彼得·范迪维尔

Answers:


19

使用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  

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.