【问题标题】:Parsing an XML file with PowerShell where multiple elements are repeated使用 PowerShell 解析重复多个元素的 XML 文件
【发布时间】:2015-08-31 21:48:12
【问题描述】:

我正在编写一个脚本来读取一个 XML 文件,例如下面的 XMLFILE.XML 内容。如果每个任务之前的所有验证都通过了各自的检查,脚本需要解析每个任务并执行可执行文件和参数。每个验证标记中的属性执行以下操作:类型告诉脚本它将检查什么信息,开关告诉验证是真还是假。有关正在验证的项目的信息包含在验证元素中。下面的可用空间验证将被解释为“如果 C 驱动器有 200 MB 可用空间继续,否则失败”。我遇到的问题是,当我解析 XML 文件以获取验证时,我一次获得所有验证,而不是一次获得一个我可以处理的验证。对于一次解析一个验证的方法,我将不胜感激。

<?xml version="1.0"?>
<Tasks>
    <Task Name="Test task 1">
        <Validation Type="Freespace" Switch="True">C|200|MB</Validation>
        <Validation Type="Registry Key" Switch="False">HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{342C9BB8-65A0-46DE-AB7A-8031E151AF69}</Validation>
        <Validation Type="Registry Value" Switch="False">HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{342C9BB8-65A0-46DE-AB7A-8031E151AF69}|DisplayVersion|4.6.1.20870</Validation>
        <Validation Type="Service" Switch="True">ccmexec|running</Validation>       
        <Executable>notepad.exe</Executable>
        <Arguments></Arguments> 
    </Task>
    <Task Name="Test Task 2">
        <Validation Type="Registry Key" Switch="False">HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{342C9BB8-65A0-46DE-AB7A-8031E151AF69}</Validation>
        <Validation Type="Registry Value" Switch="False">HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{342C9BB8-65A0-46DE-AB7A-8031E151AF69}|DisplayVersion|4.6.1.20870</Validation>
        <Validation Type="Service" Switch="True">ccmexec|running</Validation>
        <Validation Type="Freespace" Switch="True">C|200|MB</Validation>
        <Executable>CMD.EXE</Executable>
        <Arguments>/C "ping 127.0.0.1 &amp; EXIT 33"</Arguments>    
    </Task>
</Tasks>

通常,要读取 XML 文件并解析其内容,我会执行类似于以下的操作:

[XML]$XMLALL = Get-Content ".\XMLFILE.XML"
    $Tasks = $XMLALL.Tasks

    Foreach ($item in $Tasks.Task){

        $Name = $item.Name
        $Validation = $item.Validation
        $Executable = $item.Executable
        $Arguments = $item.Arguments

        Write-host "`n Task Name: " $Name
        Write-host "Validation: " $Validation
        Write-host "Executable: " $Executable

    }

这给出了以下输出:

任务名称:测试任务 1 验证: 可执行文件:notepad.exe

任务名称:测试任务 2 验证: 可执行文件:CMD.EXE

【问题讨论】:

  • XMLALL.tasks.task[0].Validation 是一个数组。您必须在 foreach 循环中评估每个 Validation 元素。

标签: xml powershell


【解决方案1】:

您已经为每个&lt;Task&gt; 节点执行此操作。您只需要为每个&lt;Validation&gt; 节点添加另一个循环,就像这样...

[XML]$XMLALL = Get-Content ".\XMLFILE.XML"

$Tasks = $XMLALL.Tasks

Foreach ($item in $Tasks.Task)
{
    $Name = $item.Name
    $Executable = $item.Executable
    $Arguments = $item.Arguments

    Write-host "`n Task Name: " $Name
    Write-host "Executable: " $Executable

    Write-host $item.Validation.Count " Validations... "

    Foreach ($validation in $item.Validation)
    {
        Write-host "`n    Type: " $validation.Type
        Write-host "  Switch: " $validation.Switch
        Write-host "   Value: " $validation.InnerText        
    }
}

【讨论】:

  • 感谢现在我明白了,谢谢。
猜你喜欢
  • 2014-10-03
  • 2021-01-02
  • 2020-12-30
  • 2011-06-11
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多