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
相关产品推荐
相关产品推荐

