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

如何用PowerShell从HTML表格提取指定信息(如序列号)

解决方案

1. 精准定位表头提取目标序列号

通过IE DOM的节点遍历能力,先锁定包含“Serial Number”的表头单元格,再定位其对应的数值单元格,从根源避免正则误匹配:

# 等待IE完全加载文档,防止DOM未就绪
while ($oIE.Busy -or $oIE.ReadyState -ne 4) { Start-Sleep -Milliseconds 500 }

# 遍历所有表格
foreach ($table in $sourceHTML.getElementsByTagName('table')) {
    # 遍历表格每一行
    foreach ($row in $table.getElementsByTagName('tr')) {
        $cells = $row.getElementsByTagName('td')
        # 检查当前行是否为"Serial Number"键值行
        if ($cells.Count -ge 2 -and $cells[0].innerText.Trim() -eq "Serial Number") {
            $serialCandidate = $cells[1].innerText.Trim()
            # 二次验证是否为8开头的7位数字
            if ($serialCandidate -match '^8\d{6}$') {
                Write-Host "匹配到目标序列号: $serialCandidate"
                # 可将结果存入数组或哈希表后续使用
            }
        }
    }
}

2. 批量提取其他表格字段

如果其他表格也是“键-值”结构,复用上述逻辑即可,只需修改目标字段列表:

# 定义需要提取的字段集合
$targetFields = @("Serial Number", "Device Model", "Manufacturer", "Purchase Date")
# 用哈希表存储最终结果
$result = @{}

foreach ($table in $sourceHTML.getElementsByTagName('table')) {
    foreach ($row in $table.getElementsByTagName('tr')) {
        $cells = $row.getElementsByTagName('td')
        if ($cells.Count -ge 2) {
            $fieldName = $cells[0].innerText.Trim()
            if ($targetFields -contains $fieldName) {
                $result[$fieldName] = $cells[1].innerText.Trim()
            }
        }
    }
}

# 输出所有提取结果
$result

3. 替代方案:脱离IE COM依赖

如果不想用IE COM对象,可使用HTML Agility Pack处理本地HTML,更高效稳定:

# 首次使用需安装模块(管理员权限执行)
# Install-Module -Name HtmlAgilityPack

$htmlDoc = New-Object HtmlAgilityPack.HtmlDocument
$htmlDoc.Load("C:\Temp\Record.htm")

# 提取序列号
$serialNode = $htmlDoc.DocumentNode.SelectSingleNode("//td[text()='Serial Number']/following-sibling::td[1]")
if ($serialNode -and $serialNode.InnerText.Trim() -match '^8\d{6}$') {
    Write-Host "序列号: $($serialNode.InnerText.Trim())"
}

# 批量提取其他字段
$fieldXpaths = @{
    "Device Model" = "//td[text()='Device Model']/following-sibling::td[1]"
    "Manufacturer" = "//td[text()='Manufacturer']/following-sibling::td[1]"
}

foreach ($field in $fieldXpaths.GetEnumerator()) {
    $node = $htmlDoc.DocumentNode.SelectSingleNode($field.Value)
    if ($node) {
        Write-Host "$($field.Key): $($node.InnerText.Trim())"
    }
}

内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:51:05