如何仅使用MSBuild的预定义任务将名称仅存在于dir2中的文件从dir1复制到dir2

时间:2019-03-19 10:55:55

标签: visual-studio msbuild

我有项目模板,已在dir2中解压缩(带有子文件夹)。模板的源项目位于dir1(带有子文件夹)中。我的任务是使用dir1中的文件的实际版本来更新dir2中来自dir1的所有文件(为简便起见,无论是否更新)。我说“早点来”是指它们与dir1中的文件同名。

问题在于dir1中有文件,而dir2中不存在文件,反之亦然-不能复制它们。 dir1和dir2都有子文件夹,因此仅复制两个目录中都存在的文件是不够的。所有这些都应准确放置在dir2的相应子目录中。

问题是-是否可以不使用内联任务(C#/ VB代码)来做到这一点?我完全理解如何在C#/ VB上执行此操作,但是如果我可以使用预定义的MSBuild任务和属性函数执行此操作,则它不是完美的解决方案。但是-到目前为止,我还没有找到解决方法:-(。

2 个答案:

答案 0 :(得分:1)

  

是否可以不使用内联任务(C#/ VB代码)来做到这一点?

有可能。就像我在评论中提到的一样。构建事件属性或Exec Task可以实现此目标。

第1步:

cmd命令xcopy path\Dir1 path\Dir2 /U /Y /E可以根据需要工作。

/U意味着仅将Dir2中存在的文件从Dir1复制到Dir2,就像同名文件的更新一样。(它适用于子文件夹和文件)

建议:使用cmd命令检查它是否可以在步骤2之前运行。

第二步:

对于Msbuild任务Exec。从现在开始,您就熟悉了msbuild,因此简而言之:

<Target Name="MyCopyCommand">
    <Exec Command="xcopy  path\Dir1 path\Dir2 /U /Y /E"/>
</Target>

此外:您可以将命令的内容添加到xx.bat中,并按以下方式使用它:

<Target Name="MyCopyCommand">
        <Exec Command="path\xx.bat"/>
</Target>

不要忘记使用DefaulTargets,AfterTargets,BeforeTargets控制何时运行复制命令来控制目标的顺序。

答案 1 :(得分:0)

对不起,我没有提到目标目录是源目录的子目录。在这种情况下,xcopy不适用于我,即使我提供了适当的/ EXCLUDE参数,也出现了循环错误。

但是-我找到了纯MSBuild解决方案,这是我的变体:

<ItemGroup>
  <ProjectFiles Include="**" Exclude="obj\**;bin\**;bak\**" />
  <TemplateIntputs Include="@(ProjectFiles)" Condition="Exists('$(IntermediateTemplateSUBPath)%(ProjectFiles.Identity)')" />
  <TemplateOutputs Include="@(TemplateIntputs->'$(IntermediateTemplateSUBPath)%(Identity)')" />
</ItemGroup>  

显然,键是“存在”功能。