На основании выборки данных вы не проинструктировали 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 прочитать значение атрибута, а не атрибут с именем и значением.