如何根据特定条件过滤现有的ItemGroup,例如文件扩展名或项目的元数据?
对于此示例,我将使用文件扩展名。我正在尝试过滤VS定义的'None'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: ''
答案 0 :(得分:35)
<ItemGroup>
<Filtered Include="@(None)" Condition="'%(Extension)' == '.ext'" />
</ItemGroup>
答案 1 :(得分:1)
对于高级过滤,我建议您使用MSBuild Community Tasks中的RegexMatch
。
在本例中,我们将过滤Versionnumbers
<RegexMatch Input="@(Items)" Expression="\d+\.\d+\.\d+.\d+">
<Output ItemName ="ItemsContainingVersion" TaskParameter="Output" />
</RegexMatch>
通过Nuget安装MSBuild社区任务:PM&gt;安装包MSBuildTasks或下载here
然后在MSBuild脚本中导入它:
<PropertyGroup>
<MSBuildCommunityTasksPath>..\.build\</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)MsBuild.Community.Tasks.Targets" />