Есть две проблемы, которые вам нужно решить:
- $ (InputFiles) указывается как скалярное свойство, но вы хотите интерпретировать его как массив
- $ (InputFiles) содержит символы подстановки, которые вы хотите расширить после вы выполняете преобразование в списке шаблонов в $ (InputFiles).
Легко решить любую из двух проблем по отдельности, но комбинация этих двух на самом деле сложно. У меня есть одно возможное решение, и оно работает, но недостатком является то, что вы должны кодировать символы * в определении шаблона.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetDir>c:\temp\MyContent</TargetDir>
<InputFilesRelativeEsc>%2A%2A\%2A.bmp;%2A%2A\%2A.txt</InputFilesRelativeEsc>
</PropertyGroup>
<Target Name="PrintNames">
<ItemGroup>
<_TempGroup Include="$(InputFilesRelativeEsc)" />
</ItemGroup>
<CreateItem Include="@(_TempGroup->'$(TargetDir)\%(Identity)')">
<Output TaskParameter="Include" ItemName="_EvaluatedGroup" />
</CreateItem>
<Message Text="_EvaluatedGroup: %(_EvaluatedGroup.FullPath)" />
</Target>
</Project>
Работает следующим образом. Свойство InputFilesRelativeEsc
представляет собой список относительных шаблонов файлов. Обратите внимание, что символы подстановки кодируются (% 2A является шестнадцатеричным кодом для звездочки). Поскольку подстановочные знаки закодированы, группа _TempGroup
не пытается искать и извлекать список файлов, пока вы Include
вводите эти шаблоны в эту группу. Теперь _TempGroup
- это группа, состоящая из двух элементов: **\*.bmp
и **\*.txt
. Теперь, когда у вас есть настоящая группа, вы можете преобразовать ее. Единственное осложнение состоит в том, что обычный механизм запуска трансформации MSBuild не расширяет подстановочные знаки. Вы должны использовать более старую задачу CreateItem
. Задача CreateItem
фактически объявлена устаревшей командой MSBuild, но она все еще работает.