Trong Powershell Lấy thông điệp được in từ SSMS


12

Nhóm DBA của chúng tôi không xác minh các bản sao lưu bằng cách sử dụng bên dưới TSQL(có thể dễ dàng thực hiện sao lưu sau và hầu như không mất thời gian, vì vậy tôi không hiểu tại sao không):

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

Họ đã có vấn đề trong quá khứ, vì vậy mặc dù chúng tôi nghĩ rằng họ đã học được từ đó, nhưng họ đã không. Tôi đã tạo tập lệnh Powershell để thực hiện việc này vì chúng tôi có khoảng hơn 100 máy chủ và tôi chỉ muốn chạy tập lệnh này với tất cả các bản sao lưu chỉ để đảm bảo chúng hợp lệ. Kịch bản dưới đây chạy chính xác (trong đó nó không bị hỏng hoặc ném lỗi), tôi tò mò liệu có cách nào để lấy lại thông điệp được in trong Powershell mà chúng ta thường nhận được trong SSMS trong đó ghi rõ Bộ sao lưu trên tệp 1 là có giá trị như xác minh.

$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?
Aaron Bertrand

Invoke-SqlCmd ... -Verbosecũng tốt nếu bạn muốn chuyển hướng đầu ra để sử dụng sau này thay vì chỉ in nó ra máy chủ ngay lập tức.
Peter Vandivier

Câu trả lời:


18

Bắt đầu ra InfoMessage (PRINT, RAISERROR) từ SQL Server bằng PowerShell

Thủ thuật, như Jonathan chỉ ra, là bạn cần phải có một người nghe gắn liền với trình quản lý kết nối lắng nghe các hành động in hoặc lỗi.

$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  

Tôi cũng dẫn đầu ra của việc thêm một tham số Out-Nullvì đó là nhiễu tôi không cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.