0

我有一个 ItemGroup,其中包含一些相互重复的项目。我想对 ItemGroup 中所有项目的修改版本执行任务。但是,到目前为止,我还没有找到一种不删除重复项目的方法。

这样的存在吗?

<ItemGroup>
  <MyMessage Include="foo"  />
  <MyMessage Include="bar"  />
  <MyMessage Include="baz"  />
  <MyMessage Include="foo"  />
  <MyMessage Include="baz"  />
  <MyMessage Include="baz"  />
</ItemGroup>

<Target Name="DemoBug">
  <Message Importance="High" Text="FIRST VERSION USING ItemGroup ..."/>
  <Message Importance="High" Text="@(MyMessage)"/>
  <Message Importance="High" Text="SECOND VERSION USING Batching and Metadata ..."/>
  <Message Importance="High" Text="someprefix;%(MyMessage.Identity);somesuffix"/>
</Target>

在我上面的示例中,FIRST VERSION 输出包含所有项目,但仅对项目的连接值执行了一次消息任务。所以这根本不是我想要的。

5>  FIRST VERSION USING ItemGroup ...
5>  foo;bar;baz;foo;baz;baz

第二个版本像我想要的那样多次执行消息任务,但它正在剥离重复项,我不希望它这样做。

5>  SECOND VERSION USING Batching and Metadata ...
5>  someprefix;foo;somesuffix
5>  someprefix;bar;somesuffix
5>  someprefix;baz;somesuffix

我想做的事情从根本上是不可能的(在这种情况下,可能是时候切换到 PowerShell 来完成我的任务了),还是有一些合理的方法可以做到这一点?

(在我的实际任务中,Items 来自 ReadLinesFromFile,经过各种处理,最终会出现在 WriteLinesToFile 中。它工作正常,除非遇到重复行)

4

1 回答 1

3

Msbuild 任务批处理不循环。它做它应该做的事情,将具有相同元数据值的项目分组。在您的示例中,它按 %(Identity) 分组。

在您的情况下,项目转换会起作用吗?就像是

<Message Importance="High" Text="@(MyMessage->'someprefix;%(Identity);somesuffix')"/>

于 2013-11-07T13:22:28.053 回答