yeg
2026-09-30 5b94409f3bc01622ba1eba570dfa347c62266df9
修 22 所取数程序只返回一行结果时被 PowerShell 拆掉一层的问题

现场症状:活跃库探到 17 个,但"扫过 0 张通道表"。原因是 Invoke-Query 返回集合时
PowerShell 会拆一层:查询只返回一行时,调用方 foreach 拿到的不是"行",而是那一行的
列值本身——$row[0] 于是变成字符串首字符(Ws16_IV_0 -> W),表名正则匹配不上,
通道表被全部跳过。

这个坑不只影响列表:正常情况每个通道每分钟只有一行新数据,数据行同样会被压扁,
推上去的行会是错的。修法是在 Invoke-Query 里用逗号包一层返回(return ,$rows)。

本地用桩验证:单行结果修复后 $row[0] 得到完整表名;一行都没扫到时日志会念出库名,
便于现场判断是不是库列表不对。
1个文件已修改
11 ■■■■■ 已修改文件
scripts/j22-collector.ps1 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/j22-collector.ps1
@@ -105,7 +105,9 @@
            [void]$reader.GetValues($values)
            [void]$rows.Add($values)
        }
        return $rows
        # 必须用逗号包一层返回:函数返回集合时 PowerShell 会拆一层,只有一行结果时
        # 调用方 foreach 拿到的就不是"行"而是那一行的列值本身,$row[0] 会变成字符串首字符。
        return ,$rows
    }
    finally { $reader.Close() }
}
@@ -215,7 +217,8 @@
    $tablesSeen = 0
    $emptyChannels = 0
    foreach ($database in (Find-ActiveDatabases $connection)) {
    $databases = Find-ActiveDatabases $connection
    foreach ($database in $databases) {
        foreach ($table in (Find-ChannelTables $connection $database)) {
            if ($table -notmatch '^Ws(\d+)_IV_0$') { continue }
            $channel = [int]$Matches[1]
@@ -286,6 +289,10 @@
    Save-ReadPositions $positions
    Write-Log ("  本轮扫过 {0} 张通道表 / {1} 个通道;其中 {2} 个通道没有新行,推送 {3} 行" -f `
        $tablesSeen, $seenChannels.Count, $emptyChannels, $sentRows)
    if ($tablesSeen -eq 0) {
        # 一张都没扫到通常是库列表不对(而不是这些库真的空):把库名念出来,便于现场判断
        Write-Log ("  提示:这些库里都没有 Ws*_IV_0 表 —— " + (($databases | Select-Object -First 8) -join ', '))
    }
    return $sentRows
}