Я согласен с решением @ Si. Но с MSBuild 4.0 вы можете сделать это со встроенным функционалом. Сценарий NAnt намного понятнее моего. Но я добавлю это в качестве решения, чтобы показать методы MSBuild 4.0:
<ItemGroup>
<CVParameters Include="$(YourBaseDir)\**\DR__*" />
</ItemGroup>
<Target Name="CopyAndRename"
Condition="'@(CVParameters)'!=''"
Outputs="%(CVParameters.Identity)">
<PropertyGroup>
<OriginalFileName>%(CVParameters.FileName)%(CVParameters.Extension)</OriginalFileName>
<Prefix>DR__</Prefix>
<PrefixLength>$(Prefix.Length)</PrefixLength>
<OriginalFileNameLength>$(OriginalFileName.Length)</OriginalFileNameLength>
<SubstringLength>$([MSBuild]::Subtract($(OriginalFileNameLength),$(PrefixLength)))</SubstringLength>
<ModifiedFileName>$(OriginalFileName.Substring($(PrefixLength),$(SubstringLength)))</ModifiedFileName>
<DestinationFullPath>$([System.IO.Path]::Combine($(DestinationDir),$(ModifiedFileName)))</DestinationFullPath>
</PropertyGroup>
<Copy SourceFiles="%(CVParameters.FullPath)"
DestinationFiles="@(DestinationFullPath)"
SkipUnchangedFiles="true" />
</Target>
Редактировать (по OP): чтобы это работало, мне пришлось заменить $(DestinationFullPath)
в Copy
на @(DestinationFullPath)
, чтобы соответствовать количеству исходных и целевых файлов. Кроме того, мне пришлось изменить префикс на DR__
, так как DR__.
не будет работать.