У вас есть несколько проблем здесь.
Сначала ваше where
условие не работает таким образом.Если вы используете where без блока сценария, у вас есть только три параметра: имя свойства из текущего объекта конвейера, оператор сравнения и фиксированное значение.
То, что вы используете в качестве первого параметра в условии where, является выражениемкоторый доставляет массив объектов, содержащий строки «SecureApps» и «webApps».
PowerShell ожидает строку, содержащую имя свойства в качестве первого позиционного параметра команды where
, не может преобразовать массив в такую строку итаким образом, происходит сбой с сообщением об ошибке.
Попытка исправить эту ошибку при сохранении простого синтаксиса вы должны найти свойство в объекте конвейера, с которым вы можете сравнить.
Ваш объект конвейераXML-узел "app", так что вы можете попробовать ParentNode.Name -eq ...
, но точечные свойства также не работают с простым синтаксисом where
, только с простыми именами свойств.
Итак, чтобы решить эту конкретную проблему, вы могли бывернуться к синтаксису блока скриптов, как это
... | Where { $_.ParentNode.Name -eq "SecureApps" }
Это неТем не менее, оптимально, потому что вы перебираете все узлы app
и только потом проверяете родительский узел application
.Лучше сначала отфильтровать по правильному узлу application
, а затем пройти по всем подузлам приложения:
foreach ($node in ($xml.configurations.application | Where name -eq "SecureApps").app ) {
Существует также возможность, о которой упоминал Ансгар в своем комментарии, использовать тот факт, что .NETs SelectNodes
использует выражения XPath, поэтому вы можете использовать условие XPath вместо механизма PowerShell:
foreach ($node in $xml.SelectNodes("/configurations/application[@name='SecureApps']/app")) {