我有一个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只显示包含它正在批处理的目录的目录?我知道它可能与批处理有关,但这就是我所知道的。
答案 0 :(得分:3)
当目标被批处理时,它独立于同一批处理目标的其他执行而执行。因此,在第一次执行时,您将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
那清除了吗?批处理有时会让人感到困惑。
以下是批处理的一些链接:
答案 1 :(得分:0)
不是
<PropertyGroup>
<RootPath>%(PathDir.Identity)</RootPath>
</PropertyGroup>
加上
<CreateItem Include="@(SubDirectory->'$(RootPath)\%(Identity)')">
导致2 x 2而不是1x4