使用MSBuild Task RoboCopy

时间:2018-11-30 14:12:26

标签: batch-file msbuild batch-processing robocopy msbuild-itemgroup

有中定义的源目录和目标目录的列表。我需要一个任务/目标来按照定义的项目组属性执行自动复制。

<ItemGroup>
<ItemToCopy Include="$(RootPath)\Audi">
    <WhereToCopy>$(FinalFolder)\Audi</WhereToCopy>
    <WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)\Custom">
    <WhereToCopy>$(FinalFolder)\Custom</WhereToCopy>
    <WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)\Audi\bin">
    <WhereToCopy>$(FinalFolder)\Audi\bin</WhereToCopy>
    <WhatToCopy>*.*</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)\Custom\bin">
    <WhereToCopy>$(FinalFolder)\Custom\bin</WhereToCopy>
    <WhatToCopy>*.*</WhatToCopy>
</ItemToCopy>

我尝试了以下代码,希望对部署文件夹中的每个项目执行复制操作。

<Target Name="CopyAll">  
   <RoboCopy  
        Source="@(ItemToCopy)"  
        Destination="%(ItemToCopy.WhereToCopy)" Files="ItemtoCopy.Whattocopy"/>  
</Target>

此外,如果我们看到项目1和2(以及3和4),则它们在将相似类型的文件从其%ItemName复制到具有子目录%ItemName的相同路径的意义上是相同的。如果我们还能避免这种额外的代码味道,那可能会很棒。 希望像下面这样工作:

<ItemToCopy Include="$(RootPath)\@PublishProjects">
        <WhereToCopy>$(FinalFolder)\@PublishProjects</WhereToCopy>
        <WhatToCopy>*.svc</WhatToCopy>
    </ItemToCopy>
where,
<ItemGroup>
    <PublishProjects Include="Audi" />
    <PublishProjects Include="Custom" />
  </ItemGroup>

2 个答案:

答案 0 :(得分:0)

您不能混用@和%。两者都表示对物料组的操作。使用%对项目组中的每个项目 执行一次操作。 @对整个项目组执行一次一次操作。请注意,并非所有任务都支持项目组。

如果使用@,则说明您使用的是具有时髦语法的“转换”。 https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-transforms

此外,项目组还可以为您匹配文件。指定文件夹确实可以工作,并且它指向该文件夹,但是msbuild的优势之一就是为您找到文件。

代替

<ItemToCopy Include="$(RootPath)\Audi">
    <WhereToCopy>$(FinalFolder)\Audi</WhereToCopy>
    <WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>

我愿意

<ItemToCopy Include="$(RootPath)Audi\*.svc">
    <TargetSubDir>Audi\</TargetSubDir>
</ItemToCopy>

然后您的目标将更像

  <Target Name="CopyFiles">
    <Copy Condition="@(ItemToCopy)!=''"
          SourceFiles="@(ItemToCopy)"
          DestinationFiles="@(ItemToCopy->'$(FinalFolder)%(TargetSubDir)%(RecursiveDir)%(Filename)%(Extension)')"
          OverwriteReadOnlyFiles="true"
          SkipUnchangedFiles="true" />
  </Target>

请记住,这是msbuild的约定,代表目录的所有属性/元数据都应包含斜杠。

答案 1 :(得分:0)

好吧,我给出的答案跳过了robocopy的用法,我承认这是您问题的特定部分。

@和%仍然适用(您不能混用它们的用法),而这多数是您在CopyAll目标中出错的地方。

<Target Name="CopyAll">  
   <RoboCopy  
        Source="@(ItemToCopy)"  
        Destination="@(ItemToCopy->'%(WhereToCopy)')" Files="@(ItemtoCopy->'%(Whattocopy)')"/>  
</Target>

查看有关变换的帮助,以更好地了解如何使用它们 https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-transforms