msbuild中的双循环?
我正在为msbuild编写一个脚本,该脚本应在一个步骤中生成两个批处理。msbuild中的双循环?,msbuild,batch-file,nested,Msbuild,Batch File,Nested,我正在为msbuild编写一个脚本,该脚本应在一个步骤中生成两个批处理。 示例:2个项目组 <ItemGroup> <GroupOne Include="1" /> <GroupOne Include="2" /> </ItemGroup> <ItemGroup> <GroupTwo Include="A" /> <GroupTwo Include="B" /> </ItemGroup>
示例:2个项目组
<ItemGroup>
<GroupOne Include="1" />
<GroupOne Include="2" />
</ItemGroup>
<ItemGroup>
<GroupTwo Include="A" />
<GroupTwo Include="B" />
</ItemGroup>
结果。但那没有发生。相反,它返回了以下无用的垃圾:
1
2
A
B
按照下面链接中的博客建议的方式(使用本地propertygroup)进行操作,如
有什么提示吗?我快发疯了-(
PS:这里有一篇关于这个主题的博客文章——不幸的是,它没有像上面所说的那样起作用:
尝试使用组1中的标识创建新项目组,并从组2的标识(或任何其他元数据)将元数据分配给新项目组。然后使用批处理在新组上迭代
<CreateItem Include="@(GroupOne)" AdditionalMetadata="Option1=%(GroupTwo.Identity)">
<Output ItemName="_Group_Merged" TaskParameter="Include"/>
</CreateItem>
<Message Text="%(_Group_Merged.Identity)-%(_Group_Merged.Option1)" />
如果您有两个以上的组,则可以添加CreateItem条目以将第三个组合并到_group_Merged中,然后迭代该组合组
<CreateItem Include="@(_Group_Merged)" AdditionalMetadata="Option2=%(GroupThree.Identity)">
<Output ItemName="_Group_Merged2" TaskParameter="Include"/>
</CreateItem>
<Message Text="%(_Group_Merged2.Identity)-%(_Group_Merged2.Option1)-%(_Group_Merged2.Option2)" />
这是一个简单得多的解决方案
<Target Name="Default">
<ItemGroup>
<Combined Include="@(GroupOne)">
<GroupTwo>%(GroupTwo.Identity)</GroupTwo>
</Combined>
</ItemGroup>
<Message Text="%(Combined.Identity) %(Combined.GroupTwo) " />
</Target>
还可以使用的技术制作三重嵌套循环
%(2.身份)
%(3.身份)
对于两个嵌套循环,此操作有效:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<GroupOne Include="1" />
<GroupOne Include="2" />
</ItemGroup>
<ItemGroup>
<GroupTwo Include="A" />
<GroupTwo Include="B" />
</ItemGroup>
<Target Name="Exec"
Outputs="%(GroupOne.Identity)">
<Message Text="Building @(GroupOne->'%(Identity)') %(GroupTwo.Identity)"/>
</Target>
</Project>
谢谢你的回答。终于成功了。在我的例子中,“组合”项目组不在任何目标内(在所有其他项目组定义之后)在这种情况下,结果只是第一个ItemGroup内容。有人知道这是为什么吗?@DogEars如何根据Name=One和GroupOne.Identity=GroupTwo.Identity筛选GroupOne以避免交叉乘积?
<CreateItem Include="@(GroupOne)" AdditionalMetadata="Option1=%(GroupTwo.Identity)">
<Output ItemName="_Group_Merged" TaskParameter="Include"/>
</CreateItem>
<Message Text="%(_Group_Merged.Identity)-%(_Group_Merged.Option1)" />
<CreateItem Include="@(_Group_Merged)" AdditionalMetadata="Option2=%(GroupThree.Identity)">
<Output ItemName="_Group_Merged2" TaskParameter="Include"/>
</CreateItem>
<Message Text="%(_Group_Merged2.Identity)-%(_Group_Merged2.Option1)-%(_Group_Merged2.Option2)" />
<Target Name="Default">
<ItemGroup>
<Combined Include="@(GroupOne)">
<GroupTwo>%(GroupTwo.Identity)</GroupTwo>
</Combined>
</ItemGroup>
<Message Text="%(Combined.Identity) %(Combined.GroupTwo) " />
</Target>
<ItemGroup>
<GroupOne Include="1">
<Name>One</Name>
</GroupOne>
<GroupOne Include="2">
<Name>Two</Name>
</GroupOne>
</ItemGroup>
<ItemGroup>
<GroupTwo Include="A">
<Name>Andrew</Name>
</GroupTwo>
<GroupTwo Include="B">
<Name>Bob</Name>
</GroupTwo>
</ItemGroup>
<Target Name="Default">
<ItemGroup>
<Combined Include="@(GroupOne)">
<GroupTwo>%(GroupTwo.Identity)</GroupTwo>
<GroupTwoName>%(GroupTwo.Name)</GroupTwoName>
</Combined>
</ItemGroup>
<Message Text="%(Combined.Identity) %(Combined.Name) %(Combined.GroupTwoName) %(Combined.GroupTwo) " />
</Target>
<Target Name="Test">
<ItemGroup>
<Loop1 Include="L11" />
<Loop1 Include="L12" />
<Loop2 Include="L21" />
<Loop2 Include="L22" />
<Loop3 Include="L31" />
<Loop3 Include="L32" />
<Loop12 Include="@(Loop1)">
<!-- Combine Loop1 and Loop2: Inherit each meta data of Loop1 and add some of Loop2. -->
<Loop2Identity>%(Loop2.Identity)</Loop2Identity>
</Loop12>
<Loop123 Include="@(Loop12)">
<!-- Combine Loop12 and Loop3: Inherit each meta data of Loop12 and add some of Loop3. -->
<Loop3Identity>%(Loop3.Identity)</Loop3Identity>
</Loop123>
</ItemGroup>
<!-- Show all entries of Loop1 and Loop2 combined -->
<Message Text="Loop12.Identity=%(Loop12.Identity), Loop12.Value1=%(Loop12.Value1), Loop12.Loop2Identity=%(Loop12.Loop2Identity)"/>
<!-- Show all entries of Loop1, Loop2 and Loop3 combined -->
<Message Text="Loop123.Identity=%(Loop123.Identity), Loop123.Loop2Identity=%(Loop123.Loop2Identity) Loop123.Loop2Identity=%(Loop123.Loop3Identity)"/>
</Target>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<GroupOne Include="1" />
<GroupOne Include="2" />
</ItemGroup>
<ItemGroup>
<GroupTwo Include="A" />
<GroupTwo Include="B" />
</ItemGroup>
<Target Name="Exec"
Outputs="%(GroupOne.Identity)">
<Message Text="Building @(GroupOne->'%(Identity)') %(GroupTwo.Identity)"/>
</Target>
</Project>
Project "D:\tmp\msbuildtest\test.xml" on node 0 (default targets).
Building 1 A
Building 1 B
Exec:
Building 2 A
Building 2 B
Done Building Project "D:\tmp\msbuildtest\test.xml" (default targets).