Из «Элемент» msbuild я хочу извлечь все те элементы, у которых нет метаданных (пожалуйста, простите меня, если я использую неправильную терминологию).
Это моя предыстория: я готовлю файлы для создания инсталляционного пакета. Файлы, которые должны войти в пакет, определяются в «Элементе» следующим образом:
<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'))/>
что приводит только к синтаксической ошибке «Обнаружен непредвиденный токен».
Любые идеи были бы хорошы.
Спасибо, Ганс.