我编写了一个powershell脚本来查询数据库以获取服务器名称列表。然后我将结果存储在一个变量中,这样我就可以通过执行以下操作来查看服务:foreach ($server in $servers)
。我没有将结果存储在变量中的问题但是当我执行foreach语句时,它不允许我正确地检索服务器名称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"
答案 0 :(得分:0)
$DataSet.Tables[0]
是一个对象,其查询中的列为属性。在您的情况下,$list
将是具有属性ServerName的PowerShell对象。
解决方案1
调用Get-DbaSqlService -ComputerName $server
时,您将传递一个整个对象,只需要提供名称,当您将其更改为Get-DbaSqlService -ComputerName $server.ServerName
时,您将只传递属性ServerName的值。
解决方案2
由于您只想探索Servername属性,因此您可以对其进行扩展,以便$list
代表您的期望。因此,您应该在Select-Object -ExpandProperty ServerName
定义$list
。
所以
$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"