Из msbuild "Item" я хочу извлечь всех тех участников, у которых нет метаданных (пожалуйста, прости меня, если я использую неправильную терминологию).
Это мой фон: я готовлю файлы длясоздание установочного пакета.Файлы, которые должны входить в пакет, определены в «Item» следующим образом:
<ItemGroup>
<Files Include="readme.txt" />
<Files Include="myfile.txt">
<Rename>help.txt</Rename>
</Files>
<Files Include="changes.log" />
<!-- more files -->
</ItemGroup>
Хотя readme.txt должен быть включен как есть, myfile.txt должен быть переименован в help.txt, потому что кто-торешил, что myfile.txt плохое имя.Я создал последовательность (внутри цели), которая переименовывает файлы с метаданными «Переименовать».
<ItemGroup>
<FilesToRename Include="@(ChangeLogs->HasMetadata('Rename'))"/>
</ItemGroup>
<Move SourceFiles="@(FilesToRename->'$(WorkDir)\source\%(Identity)')" DestinationFiles="@(FilesToRename->'$(WorkDir)\source\%(Rename)')" />
Для копирования этих файлов в установочный пакет мне нужен элемент, состоящий из имен «Переименовать»для переименованных файлов и оригинальных имен для остальных;в этом примере «readme.txt; help.txt; changes.log» (в любом порядке).Моей первой попыткой было использование «FilesToRename» сверху и добавление «перевернутого» выражения, например:
<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@(Files->Not HasMetadata('Rename'))" />
, но оно не раскрывается.Я также не мог заставить работать «Условие», например
<FilesToCopy Include="@(Files)" Condition="Not @(Files->HasMetadata('Rename'))/>
, что приводит к синтаксической ошибке «Обнаружен неожиданный токен».
Любые идеи приветствуются.
Спасибо, Ганс