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

Move and rename file with double extension using MSBuild

在 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(应该是这样)。

如何解决?

Move and rename file with double extension using MSBuild

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

为此,请将 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.*:

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

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

效果很好。