1

这是考试 XML ..

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <title>a book</title>
        <writer>Tom</writer>
    </book> 
    <book>
        <title>b book</title>
        <writer>John</writer>
    </book> 
    <book>
        <title>c book</title>
        <writer>Tom</writer>
    </book> 
</books>

我想找一个名单,这个作家是汤姆。所以我的脚本是

[xml]$books = Get-Content C:\Users\Administrator\Documents\books.xml
$books.book| %{$_.book.writer -match 'Tom'}

但这个剧本只显示作家......

writer
Tom
Tom

我想看到这样的

title      writer
a book     Tom
c book     Tom

请帮帮我。

4

3 回答 3

2

您可能想使用?,也就是Where-Object代替%

$books.book| ?{$_.book.writer -match 'Tom'}

这是对前一个管道元素的过滤器,在ForEach-Object您进行投影(即创建新的对象序列)时限制从中产生的内容。

但是,您的代码和输出没有意义。首先,$books不应该有book属性,而是books. 你应该看过

True
False
True

而不是对象,除非每本书writer有多个元素。writer

于 2013-08-30T07:41:26.267 回答
1

我的意思是写

select-xml -Path C:\XML\doc2.txt -XPath "//book[writer='Tom']//ancestor::book"

标题作家

一本书汤姆 c 书汤姆

欧内斯特·布兰特

于 2017-05-28T16:52:34.567 回答
0

使用 Powershell 4 只需使用

$books.books.book

于 2015-04-04T12:50:37.327 回答