MSBuild筛选具有条件的文件组

MSBuild筛选具有条件的文件组,msbuild,Msbuild,这感觉很简单,但我无法让它工作 我试图实现的只是一个经过筛选的嵌入式资源列表。我尝试过各种方法,但似乎都做不好 以下是我认为正确的解决方案: <ItemGroup> <AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$(FullPath.Contains('Change')"/> </ItemGroup> 编辑。。。 要澄清的是,结果没有条件,列表是所有嵌入的资源,有条件,组

这感觉很简单,但我无法让它工作

我试图实现的只是一个经过筛选的嵌入式资源列表。我尝试过各种方法,但似乎都做不好

以下是我认为正确的解决方案:

<ItemGroup>
  <AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$(FullPath.Contains('Change')"/>
</ItemGroup>

编辑。。。 要澄清的是,结果没有条件,列表是所有嵌入的资源,有条件,组是空的


我在target的内部和外部都尝试过这个方法,我尝试在一个组中获取完整列表,然后在另一个组中进行过滤。我知道我只是误解了msbuild语法的一些基本部分,我似乎无法解决它。期待着被证明我愚蠢的错误

在目标中,可以使用项的批处理语法和
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>


请注意,此语法仅在目标内部有效,而在静态求值期间无效(直接在
节点下的项目组)。

条件属性必须返回布尔值,并对项目组的每个元素进行操作。 您可以使用%(标识)访问每个元素。 假设您有一个名为UnfilteredItems的未筛选项目组,您希望使用一些正则表达式模式将其筛选到名为MyFilteredItems的组中

<ItemGroup>
  <MyFilteredItems Include="@(UnfilteredItems)" Condition="$([System.Text.RegularExpressions.Regex]::Match(%(Identity),'.*\\bin\\.*').Success)"/>
</ItemGroup> 


$
用于引用属性。您希望引用元数据,这是使用
%
完成的,因此对于初学者,您应该
%(完整路径…
。但是我100%确定这之前已经被询问过,所以只需四处搜索即可。@stijn所以我也这么认为,但是如果我使用此语法[Condition=“%(完整路径)。Contains('Change')”],我会得到错误[error MSB4092:意外标记”。”在条件“%(完整路径)中的字符位置12处找到。包含('Change')”]也有人问过类似的问题,但无论我做什么来跟随他们的例子,似乎都不够接近。我将进行编辑以包含指向我尝试的内容的链接…@Adam在静态评估(project global)期间您需要这样做吗或者在目标内部?在静态评估期间很难执行。@MartinUllrich目的是将文件列表传递给任务,然后验证其他一些内容(如果有任何区别,请参见内联任务).我在包含任务的目标之外和任务之前在目标内部都试过。两种方法都不起作用。效果都很好!谢谢!很高兴我不仅仅是愚蠢…很失望,它太晦涩了!