2

我有一个 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 只显示包含它正在批处理的目录的目录?我知道这可能与批处理有关,但这就是我所知道的。

4

2 回答 2

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

这样就清楚了吗?批处理有时会让人感到困惑。

以下是一些关于批处理的链接:

于 2009-09-10T04:28:47.777 回答
0

难道不是

<PropertyGroup>
  <RootPath>%(PathDir.Identity)</RootPath>
</PropertyGroup>

再加上

<CreateItem Include="@(SubDirectory->'$(RootPath)\%(Identity)')">

这导致 2 x 2 而不是 1x4

于 2009-04-29T08:51:36.670 回答