2013-08-03 2 views
15

Я новичок в powershell. У меня есть конфигурационный XML, который гласит -Анализ xml с использованием powershell

<xml> 
    <Section name="BackendStatus"> 
     <BEName BE="crust" Status="1" /> 
     <BEName BE="pizza" Status="1" /> 
     <BEName BE="pie" Status="1" /> 
     <BEName BE="bread" Status="1" /> 
     <BEName BE="Kulcha" Status="1" /> 
     <BEName BE="kulfi" Status="1" /> 
     <BEName BE="cheese" Status="1" /> 
    </Section> 
</xml> 

Мне нужно разобрать каждый элемент в BEName для проверки статуса. Как это можно сделать с помощью PowerShell?

ответ

38

Первый шаг, чтобы загрузить вашу строку XML в XmlDocument, используя уникальную способность Powershell, чтобы бросить строки в [XML]

$doc = [xml]@' 
<xml> 
    <Section name="BackendStatus"> 
     <BEName BE="crust" Status="1" /> 
     <BEName BE="pizza" Status="1" /> 
     <BEName BE="pie" Status="1" /> 
     <BEName BE="bread" Status="1" /> 
     <BEName BE="Kulcha" Status="1" /> 
     <BEName BE="kulfi" Status="1" /> 
     <BEName BE="cheese" Status="1" /> 
    </Section> 
</xml> 
'@ 

Powershell делает его очень легко разобрать XML с точечной нотации , Это инструкция произведет последовательность XmlElements для BEName элементов:

$doc.xml.Section.BEName 

Затем вы можете направить эти объекты в Where-Object, чтобы отфильтровать вниз результаты. Вы можете использовать ? в качестве ярлыка для того, где

$doc.xml.Section.BEName | ? { $_.Status -eq 1 } 

Выражение в фигурных скобках будет оцениваться для каждого XmlElement в трубопровода, а только те, которые имеют статус 1 будет возвращен. Оператор $ _ ссылается на текущий объект в конвейере (XmlElement).

Если вам нужно что-то сделать для каждого объекта в вашем конвейере, вы можете передать объекты в командлет foreach-object, который выполняет блок для каждого объекта в конвейере. % является сокращением для foreach:

$doc.xml.Section.BEName | ? { $_.Status -eq 1 } | % { $_.BE + " is delcious" } 

Powershell отлично подходит для этого материала. Очень легко собрать трубопроводы объектов, фильтровать трубопроводы и выполнять операции над каждым объектом в трубопроводе.

9
[xml]$xmlfile = '<xml> <Section name="BackendStatus"> <BEName BE="crust" Status="1" /> <BEName BE="pizza" Status="1" /> <BEName BE="pie" Status="1" /> <BEName BE="bread" Status="1" /> <BEName BE="Kulcha" Status="1" /> <BEName BE="kulfi" Status="1" /> <BEName BE="cheese" Status="1" /> </Section> </xml>' 

foreach ($bename in $xmlfile.xml.Section.BEName) { 
    if($bename.Status -eq 1){ 
     #Do something 
    } 
} 
Смежные вопросы