Нельзя смешивать @ и%.Оба из них указывают на операцию над группой товаров.Использование% выполняет операцию один раз для каждого элемента в группе элементов.@ выполняет операцию один раз для всей группы товаров.Обратите внимание, что не все задачи поддерживают группы элементов.
Если вы используете @, тогда вы используете «преобразование», которое имеет необычный синтаксис.https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-transforms
Кроме того, группы предметов предназначены для соответствия файлов для вас.Указание папок работает и относится к папке, но одной из сильных сторон msbuild является поиск файлов для вас.
Вместо
<ItemToCopy Include="$(RootPath)\Audi">
<WhereToCopy>$(FinalFolder)\Audi</WhereToCopy>
<WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>
Я бы пошел с
<ItemToCopy Include="$(RootPath)Audi\*.svc">
<TargetSubDir>Audi\</TargetSubDir>
</ItemToCopy>
Тогда ваша цель будет больше похожа на
<Target Name="CopyFiles">
<Copy Condition="@(ItemToCopy)!=''"
SourceFiles="@(ItemToCopy)"
DestinationFiles="@(ItemToCopy->'$(FinalFolder)%(TargetSubDir)%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="true" />
</Target>
Помните, это соглашение msbuild о том, что все свойства / метаданные, представляющие каталог, включают в себя завершающий слеш.