25

如何根据特定条件(例如文件扩展名或项目的元数据)过滤现有的 ItemGroup?

对于此示例,我将使用文件扩展名。我正在尝试过滤 VS 定义的“无”ItemGroup,以便我的目标可以对给定扩展名的所有文件进行操作。

例如,可以定义以下内容:

<ItemGroup>
    <None Include="..\file1.ext" />
    <None Include="..\file2.ext" />
    <None Include="..\file.ext2" />
    <None Include="..\file.ext3" />
    <None Include="..\file.ext4" />
</ItemGroup>

我想过滤上面的“无”ItemGroup,所以它只包含ext扩展名。请注意,我不想指定要排除的所有扩展,因为它们会因项目而异,并且我试图使我的目标无需修改即可重用。

我尝试Condition在目标中添加一个:

<Target Name="Test">
    <ItemGroup>
        <Filtered
            Include="@(None)"
            Condition="'%(Extension)' == 'ext'"
            />
    </ItemGroup>
    <Message Text="None: '%(None.Identity)'"/>
    <Message Text="Filtered: '%(Filtered.Identity)'"/>
</Target>

但遗憾的是,它不起作用。我得到以下输出:

Test:
  None: '..\file1.ext'
  None: '..\file2.ext'
  None: '..\file.ext2'
  None: '..\file.ext3'
  None: '..\file.ext4'
  Filtered: ''
4

2 回答 2

39
<ItemGroup>
  <Filtered Include="@(None)" Condition="'%(Extension)' == '.ext'" />
</ItemGroup>
于 2012-09-01T00:12:55.543 回答
1

对于高级过滤,我建议使用RegexMatchMSBuild Community Tasks中的。

在本例中,我们将过滤版本号

    <RegexMatch Input="@(Items)" Expression="\d+\.\d+\.\d+.\d+">
        <Output ItemName ="ItemsContainingVersion" TaskParameter="Output" />
    </RegexMatch>

通过 Nuget 安装 MSBuild 社区任务:PM> Install-Package MSBuildTasks 或在此处下载

然后在您的 MSBuild 脚本中导入它:

<PropertyGroup>
    <MSBuildCommunityTasksPath>..\.build\</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)MsBuild.Community.Tasks.Targets" />
于 2016-02-25T13:51:03.103 回答