我正在尝试复制一堆名称以前缀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个文件,但为了清晰起见我修剪了它
答案 0 :(得分:2)
知道了!它似乎是一个愚蠢的错误和一个看似强制参数的组合。至于第一个,有两个目标叫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>
请注意:
@(CvParamFiles, '
')
语法打印了ItemGroups,这似乎用换行符替换;
Count="1"
现已传递给RegexReplace