将包含通配符的MSBuild属性展开到项中
本文关键字:属性 包含 通配符 MSBuild | 更新日期: 2023-09-27 18:21:41
我正在尝试编写MSBuild脚本,该脚本将对某个预定义目录(F:''files)中的任意文件(在命令行中指定为属性)执行某些操作(例如打印其路径)。
给定以下目录结构
F:'Files'TextFile.txt
F:'Files'Subdir1'ImageFile.bmp
F:'Files'Subdir1'SubSubdir'ImageFile2.bmp
F:'Files'Subdir1'SubSubdir'TextFile2.txt
和MSBuild脚本
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetDir>F:'Files</TargetDir>
</PropertyGroup>
<ItemGroup>
<Files Include="$(TargetDir)'$(InputFiles)"/>
</ItemGroup>
<Target Name="PrintNames">
<Message Text="Files: @(Files, ', ')" />
</Target>
</Project>
在InputFiles设置为"**''*.bmp;**''*.txt"的情况下运行脚本仅适用于bmp文件。Txt文件取自当前工作目录,而不是"F:''files"
有两个问题需要解决:
- $(InputFiles)被指定为标量属性,但您希望将其解释为数组
- $(InputFiles)包含通配符,您希望在对$(InputFile)中的模式列表进行转换后扩展
单独解决这两个问题中的任何一个都很容易,但将两者结合起来实际上很棘手。我有一个可能的解决方案,它很有效,但缺点是必须在模式定义中编码"*"字符。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetDir>c:'temp'MyContent</TargetDir>
<InputFilesRelativeEsc>%2A%2A'%2A.bmp;%2A%2A'%2A.txt</InputFilesRelativeEsc>
</PropertyGroup>
<Target Name="PrintNames">
<ItemGroup>
<_TempGroup Include="$(InputFilesRelativeEsc)" />
</ItemGroup>
<CreateItem Include="@(_TempGroup->'$(TargetDir)'%(Identity)')">
<Output TaskParameter="Include" ItemName="_EvaluatedGroup" />
</CreateItem>
<Message Text="_EvaluatedGroup: %(_EvaluatedGroup.FullPath)" />
</Target>
</Project>
它的工作原理如下。属性InputFilesRelativeEsc
是相关文件模式的列表。请注意,通配符已编码(%2A是星号的十六进制代码)。由于通配符进行了编码,所以_TempGroup
组不会尝试搜索和提取文件列表,而Include
将此模式放入该组中。现在_TempGroup
是由两个元素组成的组:**'*.bmp
和**'*.txt
。既然你有了一个真正的组,你就可以对它进行转换。唯一复杂的是,运行转换的普通MSBuild机制不会扩展通配符。您必须使用较旧的CreateItem
任务。CreateItem
任务实际上已被MSBuild团队声明为弃用,但它仍然有效。