我有一个msbuild项目,这让我想知道为什么结果是这样的。这并不是说它造成了问题或任何类似的事情,但我想试着更好地理解它。
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="TestTarget1;TestTarget2" ToolsVersion="3.5">
<ItemGroup>
<PathDir Include="C:\RootDir\UniqueDir1"/>
<PathDir Include="C:\RootDir\UniqueDir2" />
</ItemGroup>
<Target Name="TestTarget1" Outputs="%(PathDir.Identity)">
<PropertyGroup>
<RootPath>%(PathDir.Identity)</RootPath>
</PropertyGroup>
<ItemGroup>
<SubDirectory Include="Common1"/>
<SubDirectory Include="Common2"/>
</ItemGroup>
<CreateItem Include="@(SubDirectory->'$(RootPath)\%(Identity)')">
<Output TaskParameter="Include" ItemName="FullPath"/>
</CreateItem>
<Message Text="@(FullPath)"/>
</Target>
<Target Name="TestTarget2">
<Message Text="@(FullPath)"/>
</Target>
</Project>因此,我有两个唯一的主路径,并且在每个主路径中,我有两个目录,每个唯一路径中的名称相同。在target1中,我根据PathDir中的项的标识进行批处理,然后对项SubDirectory执行转换,以创建一个包含完整路径的新项。因此,在这之后,目标的输出如下所示:
目标1:
C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2
C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2目标2:
C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2;C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2所以我想我的问题是...为什么target1只显示包含要批量处理的目录的目录?我知道这可能与批处理有关,但这是我所知道的全部。
发布于 2009-09-10 04:28:48
当一个目标被批处理时,它独立于同一批处理目标的其他执行而执行。因此,在第一次执行中,您将FullPath项填充到内容中
C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2然后,在第二次执行目标时,将FullPath的值填充为
C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2由于项目对同一批处理目标不可见,因此第二次传递不会“看到”该FullPath项目。但是当TestTarget1完成时,FullPath的值被组合成一个值,即。
C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2;C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2这样说清楚了吗?批处理有时会让人感到困惑。
以下是有关批处理的一些链接:
发布于 2009-04-29 08:51:37
这不是
<PropertyGroup>
<RootPath>%(PathDir.Identity)</RootPath>
</PropertyGroup>再加上
<CreateItem Include="@(SubDirectory->'$(RootPath)\%(Identity)')">这导致了2x2而不是1x4
https://stackoverflow.com/questions/799389
复制相似问题