将包含通配符的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"

将包含通配符的MSBuild属性展开到项中

有两个问题需要解决:

  1. $(InputFiles)被指定为标量属性,但您希望将其解释为数组
  2. $(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团队声明为弃用,但它仍然有效。

相关文章: