You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:41