Msbuild 如何从属性值创建复制项?

Msbuild 如何从属性值创建复制项?,msbuild,Msbuild,假设我有一个子路径列表,例如 <PropertyGroup> <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths> </PropertyGroup> $(路径1)\***$(路径2)\***$(路径3)\file3.txt; 我想把这些文件从文件夹A复制到文件夹B(当然我们已经有了A中的所有子文件夹/文件)。我尝试的是: <Target N

假设我有一个子路径列表,例如

 <PropertyGroup>
   <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths>
</PropertyGroup>

$(路径1)\***$(路径2)\***$(路径3)\file3.txt;
我想把这些文件从文件夹A复制到文件夹B(当然我们已经有了A中的所有子文件夹/文件)。我尝试的是:

<Target Name="Replace" DependsOnTargets="Replace_Init; Replace_Copy1Path">
</Target>

<Target Name="Replace_Init">
  <PropertyGroup>
    <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths>
  </PropertyGroup>
  <ItemGroup>
    <subPathItems Include="$(subPathFiles.Split(';'))" />
  </ItemGroup>
</Target>

<Target Name="Replace_Copy1Path" Outputs="%(subPathItems.Identity)">
  <PropertyGroup>
    <src>$(folderA)\%(subPathItems.Identity)</src>
    <dest>$(folderB)\%(subPathItems.Identity)</dest>
  </PropertyGroup>
  <Copy SourceFiles="$(src)" DestinationFiles="$(dest)" />
</Target>

$(路径1)\***$(路径2)\***$(路径3)\file3.txt;
$(folderA)\%(subPathItems.Identity)
$(folderB)\%(subPathItems.Identity)

但是复制任务不起作用。它不会将
***
转换为文件。我做错了什么?请帮忙

我认为你做不了那样的事

$(subPathFiles.Split(“;”)
返回一个属性,其中值用分号分隔,因此此调用无效

如果要保留此机制,应使用以下任务
StringToItemCol


$(路径1)\***$(路径2)\***$(路径3)\file3.txt;
否则,您可以直接传递嵌入folderA和子路径的项:

<ItemGroup>
  <subPathIt Include="$(folderA)\$(path1)\**\*"/>
  <subPathIt Include="$(folderA)\$(path2)\**\*"/>
  <subPathIt Include="$(folderA)\$(path3)\file3.txt" Condition="Exists('$(path3)\file3.txt')"/>
</ItemGroup>


<Target Name="Replace_Copy1Path">
  <Copy SourceFiles="@(subPathItems )" 
        DestinationFiles="$(folderB)\%(RecursiveDir)\%(Filename)%(Extension)" />
</Target>


谢谢madgnome!但正如你所说的,如果我们这样做,我们就不会有@files,它包含folderA和folderB中的所有文件,对吗?对。亲爱的玛格诺,你得写两封信,我不这么认为。我只是仔细检查了一下,如果我像上面那样声明,所有文件都会递归地添加到文件中。真奇怪!我的错,分号可以在项目包含中用于分隔多个项目列表。您可以在项目定义中使用分号分隔多个项目列表。这回答了你的问题吗?
<ItemGroup>
  <subPathIt Include="$(folderA)\$(path1)\**\*"/>
  <subPathIt Include="$(folderA)\$(path2)\**\*"/>
  <subPathIt Include="$(folderA)\$(path3)\file3.txt" Condition="Exists('$(path3)\file3.txt')"/>
</ItemGroup>


<Target Name="Replace_Copy1Path">
  <Copy SourceFiles="@(subPathItems )" 
        DestinationFiles="$(folderB)\%(RecursiveDir)\%(Filename)%(Extension)" />
</Target>