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

使用PowerShell和正则表达式将字符串解析为自定义PSCustomObject数组

解决方案

你要解析的是飞塔防火墙的标准key=value格式日志,无需为每个字段单独编写正则捕获组,用通用规则匹配所有键值对即可自动生成PSCustomObject,实现代码如下:

# 通用键值对匹配正则:匹配 键=值 格式,值支持引号包裹或无引号非空格内容
$kvPattern = '(\w+)=(".*?"|\S+)'

$logObjects = $cmd | ForEach-Object {
    # 初始化有序哈希表存储键值对
    $logHash = [ordered]@{}
    # 匹配当前日志行的所有键值对
    $matchResult = [regex]::Matches($_, $kvPattern)
    foreach ($m in $matchResult) {
        $key = $m.Groups[1].Value
        # 去除值两端的双引号
        $value = $m.Groups[2].Value.Trim('"')
        $logHash[$key] = $value
    }
    # 哈希表直接转换为PSCustomObject
    [PSCustomObject]$logHash
}

# 如果只需要你指定的几个字段,可以单独筛选重命名
$filteredLogs = $logObjects | Select-Object srcip, dstip, srcport, dstport, @{Name='fw'; Expression={$_.devname}}

# 输出前5条查看结果
$filteredLogs | Select-Object -First 5 | Format-Table

原代码问题说明

你之前编写的正则存在多处语法和逻辑错误:

  • 错误添加转义符,比如\devname的写法不符合正则规则
  • 捕获组范围错误,把srcip=这类字段前缀也包含到了要提取的取值范围内
  • 额外添加了不存在的:分隔符匹配规则,原日志字段之间是空格分隔

用上述通用方法可以适配所有同格式的飞塔日志,后续需要新增字段时直接在Select-Object中添加对应键名即可,无需修改正则规则。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:57:03