Не удается заставить задачу сообщества MSBuild RegexReplace работать
Я пытаюсь скопировать кучу файлов, имена которых начинаются с префикса DR__
, но копии должны иметь этот префикс удален. То есть, DR__foo
должен быть скопирован как foo
, Я пытаюсь это, что основано на примере, приведенном в документации (.chm):
<Target Name="CopyAuxiliaryFiles">
<MakeDir Directories="$(TargetDir)Parameters" Condition="!Exists('$(TargetDir)Parameters')" />
<ItemGroup>
<ContextVisionParameterFiles Include="$(SolutionDir)CVParameters\DR__*" />
</ItemGroup>
<Message Text="Files to copy and rename: @(ContextVisionParameterFiles)"/>
<RegexReplace Input="@(ContextVisionParametersFiles)" Expression="DR__" Replacement="">
<Output ItemName ="DestinationFullPath" TaskParameter="Output" />
</RegexReplace>
<Message Text="Renamed Files: @(DestinationFullPath)"/>
<Copy SourceFiles="@(ContextVisionParameterFiles)" DestinationFiles="@(DestinationFullPath)" />
</Target>
DestinationFullPath
выходит пустым (или это то, что я вижу, когда я показываю это с Message
). Таким образом, Copy
не удается, потому что нет DestinationFiles
указаны. Что здесь не так?
Редактировать: ContextVisionParameterFiles не является пустым, он содержит это:
D:\SVN.DRA.WorkingCopy\CVParameters\DR__big_bone.alut;D:\SVN.DRA.WorkingCopy\CVParameters\DR__big_medium.gop
Они на самом деле 40 файлов, но я обрезал это для ясности
1 ответ
Понял! Кажется, это была комбинация глупой ошибки и, казалось бы, обязательного параметра. Что касается первого, было две цели под названием CopyAuxiliaryFiles
, Что касается второго, кажется, Count
параметр необходим.
Финальная, рабочая версия:
<Target Name="CopyCvParameters">
<ItemGroup>
<CvParamFiles Include="$(SolutionDir)CVParameters\DR__*" />
</ItemGroup>
<Message Text="Input:
@(CvParamFiles, '
')"/>
<!-- Replaces first occurance of "foo." with empty string-->
<RegexReplace Input="@(CvParamFiles)" Expression="^.*DR__" Replacement="$(TargetDir)Parameters\" Count="1">
<Output ItemName ="RenamedCvParamFiles" TaskParameter="Output" />
</RegexReplace>
<Message Text="
Output RenamedCvParamFiles:
@(RenamedCvParamFiles, '
')" />
<Copy SourceFiles="@(CvParamFiles)" DestinationFiles="@(RenamedCvParamFiles)" SkipUnchangedFiles="True" />
</Target>
Заметить, что:
- Я переименовал цель, чтобы решить конфликт имен (почему Visual Studio не обнаруживает это как ошибку?)
- Я довольно распечатал ItemGroups с
@(CvParamFiles, '
')
синтаксис, который, кажется, заменить;
с переносами строк - Мое регулярное выражение заменяет абсолютный путь и префикс
Count="1"
теперь передается в RegexReplace