PowershellでSSMSから印刷されたメッセージを取得する


12

私たちのDBAチームは、以下を使用してバックアップを検証していませんTSQL(バックアップ後に簡単に実行でき、ほとんど時間がかからないので、理由がわかりません)。

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

彼らは過去に問題を抱えていたので、そこから学べると思っていても、そうではありません。約100台以上のサーバーがあり、すべてのバックアップに対してこのスクリプトを実行して、それらが有効であることを確認するため、これを行うためにPowershellスクリプトを作成しました。以下のスクリプトは正しく実行されます(エラーが発生したり、エラーが発生したりしないため)、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すぐにホストに出力するのではなく、後で使用するために出力リダイレクトする場合にも便利です。
Peter Vandivier、

回答:


19

PowerShellを使用したSQL ServerからのInfoMessage出力(PRINT、RAISERROR)のキャプチャ

トリックは、ジョナサンが指摘するように、印刷またはエラーアクションをリッスンする接続マネージャーにリスナーを接続する必要があることです。

$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.