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

使用PowerShell将含name-value对的文本转换为正确PSObject对象

问题背景

待解析的文本文件以大括号为边界存储多组键值对,单组结构示例:

{
  name: 'var1_name'
  value: 'var1_value'
}
{
  name: 'var2_name'
  value: 'var2_value'
}

直接执行Get-Content file.txt | ConvertFrom-String时,因未指定块识别规则,解析结果无法按大括号聚合为包含name、value属性的PSObject,输出结构错乱。
预期输出格式:

name       value
---------  ----------
var1_name  var1_value
var2_name  var2_value
可行方案

方案1:正则逐块提取(全PowerShell版本兼容,稳定性最高)

一次性读取文件全文,通过正则匹配每个大括号包裹的块,提取字段后手动构造自定义对象,代码如下:

# 读取文件完整内容,不按行拆分
$rawContent = Get-Content -Path file.txt -Raw
# 正则匹配所有块,捕获name和value字段值
$blockMatches = [regex]::Matches($rawContent, '\{\s*name:\s*''([^'']+)''\s*value:\s*''([^'']+)''\s*\}')
# 生成PSObject集合
$result = foreach ($match in $blockMatches) {
    [PSCustomObject]@{
        name  = $match.Groups[1].Value
        value = $match.Groups[2].Value
    }
}

执行后输出$result即可得到预期的结构化表格。

方案2:为ConvertFrom-String指定解析模板

如果要使用ConvertFrom-String,需要提前传入匹配模板,通过*标记新对象的起始字段,告知cmdlet对象边界:

$parseTemplate = @'
{
  name: '{name*:demo_name}'
  value: '{value:demo_value}'
}
'@
$result = Get-Content file.txt | ConvertFrom-String -TemplateContent $parseTemplate

模板内的示例值仅做格式参考,不会影响实际解析结果。

方案3:转成标准JSON后用内置cmdlet解析

当前文件格式与JSON高度接近,简单替换格式后即可用ConvertFrom-Json直接反序列化,适合文件格式高度统一的场景:

$rawContent = Get-Content file.txt -Raw
# 替换格式为合法JSON
$json = $rawContent `
    -replace '(\w+):', '"$1":' ` # 给键名加双引号
    -replace '\}\s*\{', '},{' ` # 块之间补逗号
    -replace "'", '"' # 单引号替换为双引号
# 补全外层数组括号后解析
$result = "[$json]" | ConvertFrom-Json
注意事项
  • 读取文件时建议加-Raw参数,否则内容会按行拆分,容易丢失块之间的结构关联
  • 如果字段值本身包含单引号、大括号等特殊字符,需要对应调整正则匹配规则或JSON替换逻辑
  • 方法2的模板解析对格式一致性要求较高,如果文件缩进、空行不固定,优先选择方法1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:45:18