使用VS MSBuild移动重命名双重扩展名文件时异常,如何修复?
解决MSBuild中双重扩展名文件重命名问题
这个问题的核心在于MSBuild对文件扩展名的解析逻辑:对于App.exe.config这类带双重扩展名的文件,%(Filename)元数据会返回App.exe(也就是最后一个.之前的完整部分),而%(Extension)只返回最后一个扩展名.config。你原来的写法是把文件名前缀替换成NewApp后直接拼接%(Extension),自然就丢掉了中间的.exe部分。
下面是两种可行的修复方案:
方案一:使用自定义元数据替换文件名前缀
在ItemGroup里为每个文件添加自定义元数据,专门处理文件名的替换,逻辑更清晰易读:
<ItemGroup> <RenameFile Include="Main\App.*"> <!-- 将文件名中的"App"替换为"NewApp" --> <NewBaseName>$([System.String]::Copy('%(Filename)').Replace('App', 'NewApp'))</NewBaseName> </RenameFile> </ItemGroup> <Move SourceFiles="@(RenameFile)" DestinationFiles="%(RootDir)%(RenameFile.Directory)%(NewBaseName)%(RenameFile.Extension)" />
这样处理后:
- 对于
App.exe,%(NewBaseName)是NewApp,拼接.exe得到NewApp.exe - 对于
App.exe.config,%(NewBaseName)是NewApp.exe,拼接.config得到NewApp.exe.config
方案二:直接在DestinationFiles中嵌入替换逻辑
如果不想额外定义元数据,也可以直接在Move任务的路径表达式里写替换逻辑,更紧凑:
<ItemGroup> <RenameFile Include="Main\App.*" /> </ItemGroup> <Move SourceFiles="@(RenameFile)" DestinationFiles="%(RootDir)%(RenameFile.Directory)$([System.String]::Copy('%(RenameFile.Filename)').Replace('App', 'NewApp'))%(RenameFile.Extension)" />
这个写法和方案一逻辑完全一致,只是把字符串替换逻辑直接整合到了路径里。
两种方案都能完美保留原文件的扩展名结构,不管是单扩展名还是多扩展名的文件都能正确重命名。
内容的提问来源于stack exchange,提问作者Alexan
相关产品推荐
相关产品推荐

