b78295e8da96c3e5e76befeef9582ce5273dbb74..47aece756f670dd80cf3d62be918f62a9ececf85
2026-09-30 yeg
更新
47aece 对比 | 目录
2026-09-30 yeg
修 22 所取数程序只返回一行结果时被 PowerShell 拆掉一层的问题
5b9440 对比 | 目录
1个文件已修改
29 ■■■■■ 已修改文件
scripts/j22-collector.ps1 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/j22-collector.ps1
@@ -73,6 +73,24 @@
    Write-Host $line
}
# ---------------------------------------------------------------- 取值转换
# 厂商列可能为 NULL:直接强转 [double]/[int] 会抛异常、让整个通道从此不再推进。
# 缺列一律转成 JSON null,后端把测量列的缺失当"设备没给",不写零代替缺失。
function To-Text($value) {
    if ($null -eq $value -or $value -is [System.DBNull]) { return $null }
    return [string]$value
}
function To-Int($value) {
    if ($null -eq $value -or $value -is [System.DBNull]) { return $null }
    return [int]$value
}
function To-Num($value) {
    if ($null -eq $value -or $value -is [System.DBNull]) { return $null }
    return [double]$value
}
# ---------------------------------------------------------------- 读取位置
# 读取位置按「库里哪张表」记:"DB_<...>/Ws<N>_IV_0" -> 端点已确认的最后一条 record_time(FILETIME 刻度)
function Get-ReadPositions {
@@ -105,7 +123,9 @@
            [void]$reader.GetValues($values)
            [void]$rows.Add($values)
        }
        return $rows
        # 必须用逗号包一层返回:函数返回集合时 PowerShell 会拆一层,只有一行结果时
        # 调用方 foreach 拿到的就不是"行"而是那一行的列值本身,$row[0] 会变成字符串首字符。
        return ,$rows
    }
    finally { $reader.Close() }
}
@@ -215,7 +235,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 +307,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
}