Powershell在多个xml标记之间获取行

时间:2016-01-19 12:28:00

标签: xml powershell

我目前正在尝试构建一个powershell脚本,它可以读取特定的XML文件并提取某些单词。这些单词将位于标签之间。

目前该文件看起来像这样。我们称之为events.xml:

<Computer>Hostname</Computer><Other>Random Text</Other<Other>More Random Text</Other><FilePath>notepad.exe</FilePath>

我想要做的是,使用Powershell脚本在<Computer></Computer><FilePath></FilePath>标记之间提取单词并将其回显给Powershell。

到目前为止,我有这个:

gc events.xml | % { [regex]::matches( $_ , '(?<=<Computer>)(.*?)(?=</Computer>)' ) } | select -expa value

这在某种程度上起作用,因为它打印出<Computer></Computer>标签之间所有字符的列表完美无瑕。但是,当尝试使脚本工作时,挑战就出现了,因此它将在BOTH(<Computer></Computer><FilePath></Filepath>)行之间打印出来。所以它会出现:

主机名
Notepad.exe的

等等。

有任何想法或建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

你应该尝试这样的事情:

首先,使用以下命令加载XML目标文件:

$xdoc = new-object System.Xml.XmlDocument
$file = resolve-path(".\<name_file>.xml")
$xdoc.load($file)
$xdoc = [xml] (get-content ".\<name_file>.xml")

/!\小心,你必须在好的目录中使用。\

然后,如您所知,XML文档的结构,您应该尝试这个:

$Couples = $xdoc.[name_of_the_tag]

选择<Computers></Computers><FilePath></FilePath>标记上方的标记。

然后,一个计数器,在while循环中使用它(开发你的xml):

$CouplesCount = $Couples.Count

在while循环中:

$i = 0
while($i -ne $CouplesCount ){
    $computer = $Couples.Computer
    $FilePath = $Couples.FilePath

    Write-Host $computer  
    Write-Host $FilePath 
    $i++
}

您应该拥有使用<Computers></Computers><FilePath></FilePath>的值打印XML文件的内容。

答案 1 :(得分:0)

感谢您通过XML解析向我指出正确的方向。

我通过这样做解决了我的脚本:

bash

这导致了一个漂亮,干净的清单。

干杯!