Я пытаюсь обработать файлы MSBuild
для извлечения имени файла в атрибуте Include
с помощью фрагмента PowerShell ниже.Фильтр на дочерних узлах XML
Get-ChildItem $xmlFile |
ForEach-Object { Write-Host $_.FullName; [xml](Get-Content $_) } |
Where-Object {
(($_.Project.ItemGroup -ne $null) -and
($_.Project.ItemGroup.ProjectFile -ne $null))
} -ErrorAction SilentlyContinue |
ForEach-Object { $_.Project.ItemGroup.ProjectFile } |
Where-Object { ($_.Include -ne $null) } |
ForEach-Object { Write-Host $_ }
Это прекрасно работает для XML, который имеет ItemGroup
дочерний элемент вроде этого:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="settings.props" />
<ItemGroup>
<ProjectFile Include="filename.proj"/>
Но, когда иерархия XML отличается (не ItemGroup
элемента), как показано ниже, скрипт завершается с ошибкой :
The property 'ItemGroup' cannot be found on this object. Verify that the property exists.
Даже ErrorAction
не подавляет вывод ошибок.
Как я могу проверить конвейер, если существует дочерний элемент, и пропускать файлы, в которых он отсутствует? А также, почему не работает параметр -ErrorAction
?
Спасибо, это работает. Все еще запутано, почему в Where-Object в моем примере нет. – MvdD