You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSBuild使用%(Extension)无法重命名扩展名?如何传路径数组?

MSBuild Target问题解决:元数据替换无效与批量路径传递

一、%(Extension)替换无效的原因及解决方法

你当前的Replace写法里,%(Extension)被当成了字面量字符串,而非解析为项的元数据值,原文件名里不存在%(Extension)这个子串,所以替换后路径无变化。

推荐两种解决方式,均能适配任意扩展名的文件:

方法1:使用.NET路径处理属性函数

直接调用内置的路径方法替换扩展名,写法简洁可靠:

<Message Text="Backing: @(Assemblies) -> @(Assemblies -> '$([System.IO.Path]::ChangeExtension("%(Identity)", ".bak"))')" Importance="High" />
<Move SourceFiles="@(Assemblies)" DestinationFiles="@(Assemblies -> '$([System.IO.Path]::ChangeExtension("%(Identity)", ".bak"))')" />

方法2:用项元数据拼接新路径

利用项自带的RootDir、Directory、Filename元数据,直接拼接出带.bak扩展名的目标路径:

<Message Text="Backing: @(Assemblies) -> @(Assemblies -> '%(RootDir)%(Directory)%(Filename).bak')" Importance="High" />
<Move SourceFiles="@(Assemblies)" DestinationFiles="@(Assemblies -> '%(RootDir)%(Directory)%(Filename).bak')" />

二、命令行传递路径数组的方法

要测试批量处理,只需在MyInputs参数中用分号分隔多个文件路径,MSBuild会自动将其解析为ItemGroup中的多个项。

示例命令:

msbuild .\Blah.csproj /t:BackupAssemblies /p:MyInputs=obj\Release\net8.0\WASDWASD.dll;obj\Release\net8.0\Another.dll;obj\Release\net8.0\Third.dll

执行后,Assemblies项会包含所有传入的文件,Target会逐个完成备份操作。

内容的提问来源于stack exchange,提问作者codenamezero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:11:16