Назад | Перейти на главную страницу

Как отфильтровать содержимое вывода скрипта Powershell?

Мне нужно зафиксировать результат запросов MSSQL в выводе Ansible, однако нет поддерживаемых модулей Ansible, которые помогли бы мне добиться этого. В качестве обходного пути я написал сценарий PowerShell, который запускает SQL-запрос и возвращает результат в странном формате с большим количеством ненужных данных, которые я хотел бы удалить.

Сценарий PowerShell

$ServerInstance = 'serverhostname'
$Database = 'master'
$Query = "DECLARE @sqlVers numeric(2,0)
DECLARE @compatlevel numeric(3,0)
SET @sqlVers = left(cast(serverproperty('productversion') as varchar), 2) 
SET @compatlevel=@sqlVers*10
SELECT name,compatibility_level
FROM sys.databases WHERE compatibility_level<>@compatlevel"
$SqlcmdOptions = @"
-S"$ServerInstance" -d "$Database" -Q "$Query"
"@
Start-Process -FilePath "SQLCMD.EXE" -ArgumentList @" 

$SqlcmdOptions
"@ -Wait -NoNewWindow -RedirectStandardOutput C:\temp\SQLCOMPLVL.txt -PassThru
Get-Content C:\temp\SQLCOMPLVL.txt

Вывод скрипта Powershell:

Как можно отформатировать вышеперечисленное либо с помощью сценария Powershell, либо в анзибле таким образом, чтобы я получал только данные следующим образом: имя значение данных comptibility_level

или, короче, я мог получить данные между название и (затронуто x строк) и мог преобразовать его в формат JSON, чтобы Ansible мог собирать выходные данные сценария PowerShell в формате JSON.

Вы можете использовать модуль SQLPS.

Пример:

 Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery" -ServerInstance "MyComputer\MainInstance"

TimeOfQuery

21.09.2017 14:48:24

Проверьте следующие ссылки: -

Импортируйте SQLPSModule

Командлеты SQL Server

Командлеты SQLPS

Invoke-SQLCMD

Слишком много комментариев, так что

Перенаправляя на стандартный вывод, вы уничтожаете возможно существующие объекты, преобразовывая их в строку.

$ServerInstance = 'serverhostname'
$Database = 'master'

$Query = "DECLARE @sqlVers numeric(2,0)
DECLARE @compatlevel numeric(3,0)
SET @sqlVers = left(cast(serverproperty('productversion') as varchar), 2) 
SET @compatlevel=@sqlVers*10
SELECT name,compatibility_level
FROM sys.databases WHERE compatibility_level<>@compatlevel"

$SqlcmdOptions = @"
-S"$ServerInstance" -d "$Database" -Q "$Query"
"@

Start-Process -FilePath "SQLCMD.EXE" -ArgumentList @" 

$SqlcmdOptions
"@ -Wait | Get-Member 

Посмотрите, что возвращает Get-Member