Не удается заставить задачу сообщества 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:&#xA;@(CvParamFiles, '&#xA;')"/>
    <!-- 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="&#xA;Output RenamedCvParamFiles:&#xA;@(RenamedCvParamFiles, '&#xA;')" />
    <Copy SourceFiles="@(CvParamFiles)" DestinationFiles="@(RenamedCvParamFiles)" SkipUnchangedFiles="True" />
  </Target>

Заметить, что:

  • Я переименовал цель, чтобы решить конфликт имен (почему Visual Studio не обнаруживает это как ошибку?)
  • Я довольно распечатал ItemGroups с @(CvParamFiles, '&#xA;') синтаксис, который, кажется, заменить ; с переносами строк
  • Мое регулярное выражение заменяет абсолютный путь и префикс
  • Count="1" теперь передается в RegexReplace
Другие вопросы по тегам