【问题标题】:Powershell query database and store results in a variablePowershell 查询数据库并将结果存储在变量中
【发布时间】:2018-05-31 05:35:09
【问题描述】:

我编写了一个 powershell 脚本来查询数据库以获取服务器名称列表。然后我将结果存储在一个变量中,这样我就可以通过每个服务器来查找服务,方法是:foreach ($server in $servers)。我将结果存储在变量中没有问题,但是当我执行 foreach 语句时,它不会让我正确地检索服务器名称 1 by 1。

如果我手动输入像 $servers = (server, server2,server3) 这样的服务器名称,那么 forEach 将起作用。 这样做的正确方法是什么?

更新:以下是脚本

$SQLServer= 'sourceServer'
$Database = 'DatabaseNameHere'

创建 SQL 查询函数

Function SQL_Query ($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = 
"Server=$SQLServer;Database=$Database;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 
$DataSet.Tables[0]  
}

使用此功能

$list=SQL_Query "Select ServerName From Server_Inventory Where Status = 'A' " 

查看返回的服务器列表

$list

我想遍历每台服务器,看看每台服务器上安装了哪些服务器

$output= Foreach ($server in $list) {
$output=Get-DbaSqlService -ComputerName $server | Where-Object 
{$_.ServiceType -in ('SSIS','Agent','Engine','SSRS','FullText')} 
}
$output | Out-GridView -Title "View all SQL Services"

【问题讨论】:

  • 我们可以看看你的 powershell 脚本吗?
  • 你的意思是它不能让你正确检索服务器名称?您是否打印了$servers 以检查您是否确实存储了结果并使用GetType() 命令检查$servers 是否实际上是一个列表?
  • 在原帖中添加了脚本,谢谢!

标签: powershell


【解决方案1】:

$DataSet.Tables[0] 是一个将查询中的列作为属性的对象。在您的情况下,$list 将是具有属性 ServerName 的 PowerShell 对象。

解决方案 1
调用Get-DbaSqlService -ComputerName $server 时,您将传递一个整个对象,您只想提供名称,当您将其更改为Get-DbaSqlService -ComputerName $server.ServerName 时,您将只传递属性ServerName 的值。

解决方案 2
由于您只想探索 Servername 属性,因此您已经可以扩展它,因此 $list 将代表您的期望。因此,您应该在定义$list 的地方添加Select-Object -ExpandProperty ServerName

所以

$list = SQL_Query "Select ServerName From Server_Inventory Where Status = 'A' " 

变成

$list = SQL_Query "Select ServerName From Server_Inventory Where Status = 'A' " | Select-Object -ExpandProperty ServerName

加法
$output 变量在每个循环中被覆盖。每个服务器的结果应附加到输出变量。

$output = @()
Foreach ($server in $list) {
   $output += Get-DbaSqlService -ComputerName $server | Where-Object {$_.ServiceType -in ('SSIS','Agent','Engine','SSRS','FullText')} 
}
$output | Out-GridView -Title "View all SQL Services"

【讨论】:

  • 我尝试了两种解决方案,它们都只给了我列表中最后一个服务器的结果,这也与我当前的脚本相同。我是否需要传递 $server.Servername 因为 $list 已经按服务器名称存储,例如: Server1 ...next row Server2 ...next row Server3
  • 我误解了这个问题,循环正在工作,只存储最后一个结果。我添加了一个(未经测试的)建议如何解决该部分!
  • 就是这样,我在脚本中发现了问题。我有 $output =@() 行,但我没有在 $output += Get-DbaSqlService 行的 '=' 前面放一个 '+'...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2013-07-30
  • 2013-04-12
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
相关资源
最近更新 更多