这感觉就像它如此简单,但我无法让它发挥作用。
我试图实现的是嵌入式资源的过滤列表。我已经尝试了各种方法,但我似乎无法做到这一点。
我认为这是正确的解决方案:
<ItemGroup>
<AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$(FullPath.Contains('Change')"/>
</ItemGroup>
编辑... 为了澄清,结果是没有条件的,列表是所有嵌入的资源,条件,组是空的。
我已经在目标内外尝试了这一点,并且我尝试在一个组中获取完整列表,然后在另一个组中进行过滤。我知道我只是误解了msbuild语法的一些基本部分,我似乎无法解决这个问题。期待出现我的愚蠢错误!
答案 0 :(得分:3)
在目标内部,可以使用项目的批处理语法并使用System.String.Copy
方法在字符串上调用实例函数来完成此操作:
<Target Name="ListAllEmbeddedResources">
<ItemGroup>
<AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$([System.String]::Copy(%(FullPath)).Contains('Change'))" />
</ItemGroup>
<Message Importance="high" Text="AllEmbeddedResources: %(AllEmbeddedResources.Identity)" />
</Target>
请注意,此语法仅适用于目标,而不适用于静态评估(直接位于<Project>
节点下的项目组)。
答案 1 :(得分:0)
Condition属性必须返回一个布尔值,并且它对itemgroup的每个元素进行操作。 您可以使用%(Identity)访问每个元素。 假设您有一个名为 UnfilteredItems 的未过滤项目组,并且希望使用某些正则表达式模式将它们过滤到一个名为 MyFilteredItems 的组中。
<ItemGroup>
<MyFilteredItems Include="@(UnfilteredItems)" Condition="$([System.Text.RegularExpressions.Regex]::Match(%(Identity),'.*\\bin\\.*').Success)"/>
</ItemGroup>