我在文件夹中有一组文件。它们的名称都与模式DR __。*相匹配。我想将它们复制到另一个文件夹,但要删除DR__前缀。我该如何使用MSBuild?我曾经用NAnt这样做:
<mkdir dir="${ClientPath + '\bin\' + ConfigurationName + '\Parameters'}"/>
<foreach item="File" property="Filename" in="CVParameters">
<if test="${string::contains(Filename, Client + '_')}">
<property name="newFilename" value="${ string::substring( Filename, string::last-index-of(Filename, '__') + 2, string::get-length(Filename) - string::last-index-of(Filename, '__') - 2) }"/>
<copy file="${ Filename }" tofile="${ ClientPath + '\bin\' + ConfigurationName + '\Parameters\' + newFilename }" overwrite="true"/>
</if>
</foreach>
最佳答案
我同意@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__.
。
关于msbuild - MSBUild:使用基于原始名称的名称复制文件(遵循模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5377917/