PowerShell查询数据库获服务器列表后foreach遍历失效问题求助
解决PowerShell遍历数据库返回服务器列表的问题
你遇到的问题根源很明确:从数据库查询返回的$list是一个DataTable对象,其中的每一项都是DataRow类型(包含整行数据),而不是你需要的纯服务器名称字符串。当你直接用foreach ($server in $list)时,$server拿到的是整行对象,不是单个服务器名,自然无法让Get-DbaSqlService正确识别目标服务器。
下面是修正后的完整实现步骤:
1. 正确提取服务器名称字符串数组
调用SQL查询函数后,需要把DataTable中的ServerName列提取为纯字符串集合,用Select-Object -ExpandProperty就能实现:
# 调用函数并提取ServerName列的纯字符串 $servers = SQL_Query "Select ServerName From Server_Inventory Where Status = 'A'" | Select-Object -ExpandProperty ServerName
这样$servers就变成了和手动赋值('server1','server2','server3')一样的字符串数组,foreach循环就能正常识别每一项了。
2. 修正foreach循环的输出逻辑
你原来的循环里在内部重复赋值$output=会覆盖之前的结果,应该直接让循环内的Get-DbaSqlService输出结果,PowerShell会自动把这些结果收集到$output变量中:
$output = Foreach ($server in $servers) { # 直接输出查询结果,不要在循环内给$output赋值 Get-DbaSqlService -ComputerName $server | Where-Object {$_.ServiceType -in ('SSIS','Agent','Engine','SSRS','FullText')} } # 输出到GridView $output | Out-GridView -Title "View all SQL Services"
完整修正后的脚本
把所有部分整合起来:
$SQLServer= 'sourceServer' $Database = 'DatabaseNameHere' 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] } # 提取纯服务器名称数组 $servers = SQL_Query "Select ServerName From Server_Inventory Where Status = 'A'" | Select-Object -ExpandProperty ServerName # 遍历查询服务 $output = Foreach ($server in $servers) { Get-DbaSqlService -ComputerName $server | Where-Object {$_.ServiceType -in ('SSIS','Agent','Engine','SSRS','FullText')} } $output | Out-GridView -Title "View all SQL Services"
这样修改后,foreach循环就能正确逐个读取服务器名称,顺利查询每个服务器上的SQL服务了。
内容的提问来源于stack exchange,提问作者Laurent
相关产品推荐
相关产品推荐

