使用MSBuild任务RoboCopy批量复制项列表



中定义了源目录和目标目录的列表。我需要一个单独的任务/目标来根据定义的项目组属性执行自动复制。

<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)Audibin">
<WhereToCopy>$(FinalFolder)Audibin</WhereToCopy>
<WhatToCopy>*.*</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)Custombin">
<WhereToCopy>$(FinalFolder)Custombin</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>

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

如果你使用@,那么你使用的是一个语法怪异的"transform"。https://learn.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约定表示目录的所有属性/元数据都包含尾部斜杠。

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

@和%仍然成立(你不能混合使用它们(,这主要是你在CopyAll目标中出错的地方。

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

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

最新更新