【问题标题】:Move and rename file with double extension using MSBuild使用 MSBuild 移动和重命名具有双扩展名的文件
【发布时间】:2018-08-31 04:17:58
【问题描述】:

在 VS MSBuild 中,我们将一组文件从一个文件夹移动到另一个文件夹:

<ItemGroup>
      <RenameFile Include="Main\App.*" />     
</ItemGroup>    
<Move SourceFiles="@(RenameFile)" DestinationFiles="%(RootDir)%(RenameFile.Directory)NewApp%(RenameFile.Extension)" />

它工作正常,除了一个文件:App.exe.config,因为它具有双重扩展名,并且重命名为 NewApp.config 而不是 NewApp.exe.config(应该是这样)。

如何解决?

【问题讨论】:

    标签: file msbuild visual-studio-2017 file-rename movefile


    【解决方案1】:

    从 MSBuild 4.0 开始我们可以使用String Item Functions,例如替换:

    <ItemGroup>
      <RenameFile Include="Main\App.*" />    
    </ItemGroup>    
    <Message Text="Move: @(RenameFile) -> @(RenameFile -> Replace('App', 'NewApp'))" Importance="High" />
    <Move SourceFiles="@(RenameFile)" DestinationFiles="@(RenameFile -> Replace('App', 'NewApp'))" />
    

    效果很好。

    【讨论】:

    • 哇,这个简单的方法我都快忘记了,看到这个问题,一直习惯用RegexReplace。因为我经常用。谢谢你的分享:)。这个答案应该被接受为答案,超过时限可以接受。
    【解决方案2】:

    使用 MSBuild 移动和重命名具有双扩展名的文件

    您似乎想将文件 App.* 移动并重命名为 NewApp.*,但使用 MSBuild 保留扩展名。您可以使用具有RegexReplace 任务的MsBuild Community Tasks

    为此,请将MSBuildTasks nuget 包添加到您的项目中,然后添加以下目标:

      <Target Name="MoveAndRename" AfterTargets="Build">
        <ItemGroup>
          <RenameFile Include="Main\App.*" />
        </ItemGroup>
        <Message Text="Files to copy and rename: @(RenameFile)" />
        <RegexReplace Input="@(RenameFile)" Expression="App." Replacement="NewApp.">
          <Output ItemName="DestinationFullPath" TaskParameter="Output" />
        </RegexReplace>
        <Message Text="Renamed Files: @(DestinationFullPath)" />
        <Move SourceFiles="@(RenameFile)" DestinationFiles="@(DestinationFullPath)" />
      </Target>
    

    使用此目标,所有App.* 文件都被移动并重命名为NewApp.*

    【讨论】:

    • 不幸的是使用nugets需要公司的批准,这不是那么简单
    最近更新 更多