筛选现有的项目组,使其仅包含符合某些条件的文件

Kal*_*son 23 msbuild filtering

如何根据特定条件(例如文件扩展名或项目元数据)过滤现有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>
Run Code Online (Sandbox Code Playgroud)

我想过滤上面的'None'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>
Run Code Online (Sandbox Code Playgroud)

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

Test:
  None: '..\file1.ext'
  None: '..\file2.ext'
  None: '..\file.ext2'
  None: '..\file.ext3'
  None: '..\file.ext4'
  Filtered: ''
Run Code Online (Sandbox Code Playgroud)

Ily*_*kov 37

<ItemGroup>
  <Filtered Include="@(None)" Condition="'%(Extension)' == '.ext'" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

  • 在`<Target>`里面似乎工作 (7认同)
  • 这对我不起作用.`错误MSB4190:在这种情况下,不允许在位置1对内置元数据"扩展"的引用"'%(扩展名)'=='.ext'". (4认同)
  • @MarcinWisnicki 确保当您想要访问众所周知的项目元数据时将 ItemGroup 放入目标中。否则你会得到这个错误。 (4认同)