msbuild - MSBUild:使用基于原始名称的名称复制文件(遵循模式)

标签 msbuild copy design-patterns rename

我在文件夹中有一组文件。它们的名称都与模式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/

相关文章:

asp.net-core - DeployIisAppPath MSBuild 属性有什么用?

ios - 使用 "copy"property 属性来维护不可变的 NSString

java - 如何将一个函数的验证包装在另一个函数中?

delphi - 在 Delphi 窗体上的控件旁边添加验证器符号

java - 如何在 Android 中管理可运行任务队列

c# - 如何使 C# 源文件由 Visual Studio 处理,但不在程序集中编译?

.net - 当项目面向 3.5 时,Msbuild 4.0 是否引用 System.Core 4.0?

c# - 如何为 SonarQube.Scanner.MSBuild.exe 提供参数?

python - 通过迭代输入的每个文件来制作 zip 的内存副本

c++ - 将数组的一部分复制到 C++ 中的 std::vector