如何过滤Powershell脚本输出的内容?

如何过滤Powershell脚本输出的内容?

我需要在 Ansible 输出中捕获 MSSQL 查询的结果,但是没有支持的 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 脚本或 ansible 格式化上述内容,以便我仅以以下方式获取数据:名称 comptibility_level 数据值

或者简而言之,我可以在之间获取数据姓名(x 行受影响)并将其转换为 JSON 格式,以便 Ansible 可以以 JSON 格式收集 powershell 脚本输出。

答案1

评论太多了,所以

重定向到标准输出,您正在通过字符串化来破坏可能存在的对象。

$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 返回的内容

答案2

您可以使用 SQLPS 模块。

例子:

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

查询时间

2017 年 9 月 21 日下午 2:48:24

查看以下链接:-

导入 SQLPSModule

SQL Server cmdlet

SQLPS cmdlet

调用-SQLCMD

相关内容