Ваш синтаксис неверен. pipe соединяет вывод одного оператора / команды со входом другого оператора / команды. Вы можете переносить длинную строку после символа канала, потому что PowerShell распознает, что оператор продолжается на следующей строке. Но если вы перенесете строку до , символ конвейера PowerShell не сможет автоматически определять продолжение строки и интерпретировать обе строки по отдельности, поскольку первая строка содержит законченный, допустимый оператор, что приводит к синтаксису Вы заметили ошибку.
Если вы хотите обернуть строку перед каналом, вы должны экранировать символ новой строки в конце первой строки с помощью обратного кавычка (`
).
$xml.SelectNodes('//DataProperty') `
| ForEach-Object { $_.ParentNode.RemoveChild($_) }
Но, опять же, лучше обернуть строку после символом трубы:
$xml.SelectNodes('//DataProperty') |
ForEach-Object { $_.ParentNode.RemoveChild($_) }
Кроме того, нет причин для установки трубы между $xml = [xml](Get-Content $_.FullName)
и $xml.SelectNodes('//DataProperty')
. Первый оператор присваивает проанализированную структуру данных XML переменной, которая затем используется во втором операторе. Второе утверждение не читает входные данные конвейера. Технически вы можете передать проанализированные данные XML в конвейер, но для этого потребуется еще ForEach-Object
вокруг SelectNodes()
.
Можно также привести аргумент, что
$xml = New-Object Xml
$xml.Load($_.FullName)
- более чистый способ загрузки данных XML, чем
$xml = [xml](Get-Content $_.FullName)
но в большинстве сценариев оба подхода будут работать.
С учетом всех проблем с синтаксисом фильтр в языке XPath является выражением в квадратных скобках. В вашем случае вы хотите удалить узлы, которые имеют атрибут Name
со значением prop1
, поэтому фильтр будет выглядеть так: [@Name="prop1"]
.
Измените свой код на что-то вроде этого:
$xml = New-Object Xml
$editFile | ForEach-Object {
$xml.Load($_.FullName)
$xml.SelectNodes('//DataProperty[@Name="prop1"]') |
ForEach-Object { $_.ParentNode.RemoveChild($_) }
}
и он должен делать то, что вы ожидаете.