如果一个ItemGroup包含一个项目,我该如何进行MSBuild条件测试?

20

这应该很简单,但我找不到如何做到这一点(或者可能不可能)。

在MSBuild中,我有一个ItemGroup,其中包含文件列表。 我只想在该ItemGroup中存在特定文件时执行任务。

类似于:

<Copy Condition="@(Files) <contains> C:\MyFile.txt" .... />

有什么办法可以做到这一点吗?最好不要编写自定义任务。

编辑:文件列表只与条件有关。否则它与任务没有关系。

1个回答

22

试试

<Copy Condition="'%(Files.Identity)' == 'C:\MyFile.txt'" .. />


是的,这应该可以工作。% 将使其“迭代”所有现有文件... 相当于: <Copy Condition="'$(File1.Identity)' == 'C:\MyFile.txt'" .. /> <Copy Condition="'$(File2.Identity)' == 'C:\MyFile.txt'" .. /> <Copy Condition="'$(File3.Identity)' == 'C:\MyFile.txt'" .. /> 等等... - Oscar Foley
3
它将遍历多个批次,但只有在条件为真时才会执行复制任务一次。@(Files)不需要是您要复制的文件集,我们在这里使用它只是为了确保仅在@(Files)中存在"C:\MyFile.txt"时才执行此复制任务。 - radical
5
很遗憾,这只在实际任务中有效,而不是在每个可能的“条件”属性下。 - marknuzz
@TimLovell-Smith 不,我认为所示的示例并没有执行“每个匹配项执行一个[<Copy...>]”而是根据ItemGroup中是否“提到了特定文件”,执行一次或不执行<Copy...>任务(使用其他未在此处显示的操作参数)。这正是OP所请求的。您想要的情况有点奇怪(匹配所有或无任何一个,但不是中间状态),因此我会考虑更复杂的<Choose> <When .../> <Otherwise .../> </Choose>结构... - Glenn Slayden
@Glenn Slayden,如果我没记错,“per matching item”是指“特定文件被[提及]”,意思是通常只有一个匹配项...但是如果该项组包含重复项呢? - Tim Lovell-Smith
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接