将包含通配符的MSBuild属性展开为Items

Mac*_*iak 4 .net c# msbuild

我想写的MSBuild脚本,将执行一些预定义的目录上的任意文件的一些动作(例如打印其路径.)(指定为命令行上的属性)(F:\文件).

给出以下目录结构

F:\Files\TextFile.txt
F:\Files\Subdir1\ImageFile.bmp
F:\Files\Subdir1\SubSubdir\ImageFile2.bmp
F:\Files\Subdir1\SubSubdir\TextFile2.txt
Run Code Online (Sandbox Code Playgroud)

和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>
Run Code Online (Sandbox Code Playgroud)

使用设置为"**\*.bmp;**\*.txt"的InputFiles运行脚本仅适用于bmp文件.Txt文件取自当前工作目录,而不是"F:\ Files"

sev*_*tov 7

您必须解决两个问题:

  1. $(InputFiles)被指定为标量属性,但您希望将其解释为数组
  2. $(InputFiles)包含在$(InputFiles)中的模式列表上进行转换要扩展的通配符.

很容易分别解决两个问题中的任何一个,但两者的结合实际上是棘手的.我有一个可能的解决方案,它可以工作,但缺点是你必须在模式定义中编码'*'字符.

<?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> 
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下.属性InputFilesRelativeEsc是相对文件模式的列表.注意通配符是编码的(%2A是星号的十六进制代码).由于通配符已编码,因此_TempGroup当您Include将此模式添加到此组时,该组不会尝试搜索和提取文件列表.现在_TempGroup是一个由两个元素组成的小组:**\*.bmp**\*.txt.既然你有一个真正的小组,你可以改变它.唯一的复杂因素是运行转换的正常MSBuild机制不会扩展通配符.你必须使用较旧的CreateItem任务.该CreateItem任务实际上已被MSBuild团队声明弃用,但它仍然有效.