ใน 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?
Aaron Bertrand

Invoke-SqlCmd ... -Verboseก็ดีถ้าคุณต้องการเปลี่ยนเส้นทางเอาต์พุตเพื่อใช้ในภายหลังแทนที่จะพิมพ์ไปยังโฮสต์ทันที
Peter Vandivier

คำตอบ:


19

การจับภาพ InfoMessage Output (PRINT, RAISERROR) จาก SQL Server โดยใช้ PowerShell

เคล็ดลับดังที่โจนาธานชี้ให้เห็นคือคุณต้องแนบผู้ฟังไว้ในเครื่องมือจัดการการเชื่อมต่อเพื่อรับฟังการพิมพ์หรือข้อผิดพลาด

$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เนื่องจากเป็นเสียงที่ฉันไม่ต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.