Получить SQL печать сообщения в переменную с помощью ExecuteNonQuery () в Powershell - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть этот простой скрипт Powershell, который выводит сообщение «Hello World!» с SQL Команда PRINT:

$conn = New-Object System.Data.SqlClient.SqlConnection "Server=<server>;Database=msdb;Integrated Security=SSPI;";
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Host $event.Message};
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true;
$conn.Open();
$cmd = $conn.CreateCommand();
$cmd.CommandTimeout=0
$cmd.CommandText = "PRINT 'Hello World!'";
$res = $cmd.ExecuteNonQuery();
$conn.Close();

Мне нужно перехватить и проанализировать этот вывод на печать. Как я могу поместить его в переменную (в дополнение к распечатке)?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Вы должны присвоить значение $event.Message глобальной переменной $global:msg (или другому имени, начинающемуся с $global:). Тогда эта переменная будет доступна вне области действия обработчика событий:

$conn = New-Object System.Data.SqlClient.SqlConnection "Server=<server name>;Database=msdb;Integrated Security=SSPI;";
$global:msg = ""
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) $global:msg = $event.Message
    Write-Host $global:msg
};
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true
$conn.Open();
$cmd = $conn.CreateCommand();
$cmd.CommandTimeout=0
$cmd.CommandText = "PRINT 'Hello World!'";
$res = $cmd.ExecuteNonQuery();
$conn.Close();
Write-Host "The event handler message '$global:msg' is inside of the global variable!"
0 голосов
/ 02 апреля 2020

Я предлагаю изменить порядок: сначала укажите переменную, а затем распечатайте:

$message = 'Hello World!'

$conn = New-Object System.Data.SqlClient.SqlConnection "Server=<server>;Database=msdb;Integrated Security=SSPI;";
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Host $event.Message};
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true;
$conn.Open();
$cmd = $conn.CreateCommand();
$cmd.CommandTimeout=0
$cmd.CommandText = "PRINT $message";
$res = $cmd.ExecuteNonQuery();
$conn.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...