foreach-объект, если возвращается, возвращая все значения - PullRequest
0 голосов
/ 12 октября 2018

У меня есть этот странный вывод, который генерируется.$ abc - это xml с 200 узлами. Я пытался найти конкретный элемент с именем хоста cat01.pdx30, но ниже показано, как распечатать все имена хостов из abc, есть идеи?

($abc.DeviceMetaData) | ForEach-Object { 
    if ($PSItem.Device.HostName -match  [regex]::Escape("cat01.pdx30")) {
        return $psitem.Device.HostName 
    }
}

$ abc выглядиткак то так:

<?xml version="1.0"?>
<DeviceMetaData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Device HostName="cat02.pdx30">
    <Property Name="Home">Region</Property>
  </Device>
  <Device HostName="cat01.mwh01">
    <Property Name="AclFile" />
    <Property Name="AnchorPresent">False</Property>
    <Property Name="CloudType">Public</Property>
    <Property Name="ConfigTemplateFile">iper_Ce.xml</Property>
    <Property Name="DcCode">mwh01</Property>
  </Device>
  <Device HostName="ALB70-RME71-226-01OSP">
    <Property Name="OpticalEnabled">True</Property>
  </Device>
</DeviceMetaData>

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Другой метод, с XPath:

[xml] $xml=get-content "C:\temp\test.xml"
$xml.SelectNodes('//DeviceMetaData/Device[@HostName="cat01.mwh01"]/Property[@Name="DcCode"]')."#text"
0 голосов
/ 12 октября 2018

На основании выборки данных вы не проинструктировали PowerShell для обработки дочерних элементов элемента DeviceMetaData.

$abc.DeviceMetaData.Device | ForEach-Object { 
    if($_.HostName -match [regex]::Escape("cat01.pdx30")) {
        $PSItem.Hostname
    }
}

Приведенный выше пример говоритPowerShell для прохождения всех элементов Device .Для каждого из этих объектов он будет сопоставляться с атрибутом HostName, а в случае совпадения просто выводит HostName.

Пожалуйста, не используйте ключевое слово return в PowerShell.Ключевое слово return прерывает выполнение из текущей области, что совершенно отличается от простого вывода некоторых данных.

Обратите внимание, что пример данных и условия поиска не совпадают.В ваших данных нет ни одного "cat01.pdx30" HostName.Просто вы не думаете, что решение не работает.

Обновление На основе новых требований этот пример делает то, что ожидается.

$abc.DeviceMetaData.Device | ForEach-Object {
    if($_.HostName -match [regex]::Escape("cat01.mwh01")) {
        $PSItem.Property | Where-Object Name -eq "DcCode" | Select-Object "#text"
    }
}

ВВ новом примере мы просматриваем все элементы Property , фильтруем их с помощью Where-Object и выделяем внутренний текст атрибута с помощью magical"#text", которыйуказывает PowerShell прочитать значение атрибута, а не атрибут с именем и значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...