求助:如何将PowerShell的systeminfo转换为结构化JSON/XML
解决SystemInfo转结构化JSON/XML的问题
我太懂你遇到的这个头疼问题了——直接跑systeminfo | ConvertTo-Json得到的是一堆零散的字符串数组,完全不是你需要的键值对结构;XML那边更离谱,生成的全是<Object Type="System.String">节点,根本没有任何结构化信息。核心原因是**systeminfo输出的是纯文本行,不是PowerShell原生的结构化对象**,所以转换命令只能把每个字符串当成独立元素处理,自然得不到你想要的格式。
下面是两种格式的具体解决方法,直接就能用:
一、生成结构化JSON
我们需要先把systeminfo的纯文本解析成键值对哈希表,再转成标准JSON:
# 1. 初始化哈希表存储键值对 $systemInfoMap = @{} # 2. 解析systeminfo输出,过滤并提取有效键值对 systeminfo | # 只保留符合"键: 值"格式的有效行 Where-Object { $_ -match '^(.+?):\s+(.+)$' } | ForEach-Object { $key = $matches[1].Trim() $value = $matches[2].Trim() $systemInfoMap[$key] = $value } # 3. 转换为结构化JSON $systemInfoMap | ConvertTo-Json
这段代码的关键是用正则^(.+?):\s+(.+)$精准匹配键: 值格式的行,非贪婪匹配第一个冒号,确保值里的特殊符号(比如BIOS版本里的逗号加日期)不会被误分割。最终输出的JSON就是你想要的"Host Name": "namehere"这种清晰的键值对结构。
二、生成结构化XML
同样先解析成结构化对象,再用ConvertTo-Xml生成规范的XML:
# 1. 先解析为键值对哈希表(和JSON步骤一致) $systemInfoMap = @{} systeminfo | Where-Object { $_ -match '^(.+?):\s+(.+)$' } | ForEach-Object { $key = $matches[1].Trim() $value = $matches[2].Trim() $systemInfoMap[$key] = $value } # 2. 转换为结构化XML(自定义根节点名称) $systemInfoMap | ConvertTo-Xml -As Document -RootName "SystemInformation"
生成的XML会有一个整洁的<SystemInformation>根节点,每个系统信息项作为子节点,比如:
<?xml version="1.0" encoding="utf-8"?> <SystemInformation> <Property Name="Host Name">namehere</Property> <Property Name="OS Name">Microsoft Windows 10 Enterprise</Property> <!-- 其他系统信息节点 --> </SystemInformation>
这样的XML完全是结构化的,后续解析或者导入其他系统都很方便。
内容的提问来源于stack exchange,提问作者Harsha Laxman
相关产品推荐
相关产品推荐

