基于dz121.xml创建哈希表的PowerShell脚本存在什么问题?
转换脚本的问题分析
你的转换哈希表脚本存在以下关键问题:
节点层级遍历错误:
$XMLdata.ChildNodes获取的是XML文档的顶级节点(比如<Objects>),这个节点本身没有实际属性值(Value为空),且你未深入到存储进程数据的<Object>和<Property>子节点,导致哈希表无法提取进程的Name、ID等有效数据。未处理多进程的XML结构:生成的XML中,每个进程对应一个
<Object>节点,每个<Object>下的<Property>才是真正的键值对(Name/Value)。你的脚本完全没有遍历这些子节点,自然无法获取到进程的具体信息。哈希表结构设计冲突:如果强行把所有进程的属性塞进同一个哈希表,会出现键名重复(比如多个进程都有Name、ID键),后写入的内容会覆盖之前的,最终只能保留最后一个进程的部分数据,这不符合提取所有进程信息的需求。
修正后的脚本示例
如果要将每个进程转换为一个哈希表,最终得到哈希表数组,可使用以下脚本:
$XMLdata = [xml]$(Get-Content .\dz121.xml) $processHashes = @() # 遍历每个进程对应的<Object>节点 $XMLdata.Objects.Object | ForEach-Object { $processHash = @{} # 遍历当前进程的所有<Property>节点,提取键值对 $_.Property | ForEach-Object { $processHash[$_.Name] = $_.InnerText } $processHashes += $processHash } # 输出所有进程的哈希表 $processHashes
如果仅需要提取单个进程的哈希表(比如第一个进程),可简化为:
$XMLdata = [xml]$(Get-Content .\dz121.xml) $ht = @{} $XMLdata.Objects.Object[0].Property | ForEach-Object { $ht[$_.Name] = $_.InnerText } $ht
内容的提问来源于stack exchange,提问作者Расим Гусаинов
相关产品推荐
相关产品推荐

