使用 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'))" />
效果很好。
在 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'))" />
效果很好。