使用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
相关产品推荐
相关产品推荐

