Если я правильно прочитал ваш вопрос, я думаю , что вы пытаетесь сделать перекрестную копию продукта: скопировать все элементы в одной ItemGroup во все папки в другой группе.
На самом деле у меня есть аккуратная цель, которую я использую для этого, потому что я ненавижу то, как TeamBuild помещает все двоичные файлы в одну папку - я хочу, чтобы проекты могли указывать, что их выходные данные являются "комплектом"и что вывод также будет скопирован в одно или несколько мест.
Для этого у меня есть две группы элементов: BundleFiles (это набор файлов, которые я хочу скопировать) и BundleFolders, которые представляют собой наборпапки, в которые я хочу скопировать.
<ItemGroup>
<BundleOutDir Include="FirstFolder;SecondFolder" />
<BundleFiles Include="file1;file2" />
</ItemGroup>
Моя цель тогда содержит две задачи, подобные этой:
<ItemGroup>
<FilesByDirsCrossProduct Include="@(BundleFiles)">
<BundleOutDir>%(BundleOutDir.FullPath)</BundleOutDir>
</FilesByDirsCrossProduct>
</ItemGroup>
Это создает группу элементов убер, содержащую перекрестный продукт файлов по папкам.
В этом случае копия довольно проста:
<Copy SourceFiles="@(FilesByDirsCrossProduct)"
DestinationFiles="@(FilesByDirsCrossProduct -> '%(BundleOutDir)\%(Filename)%(Extension)' ) "
SkipUnchangedFiles="true" />
Затем эти файлы копируются в папку, указанную в их метаданных.
Моя цель на самом деле немного умнеетем, что я могу объявить, что пакеты будут перемещаться в подпапки и / или я могу переименовать файл во время копирования с помощью метаданных, но это другая история