如何以递归方式复制MSBuild中的文件,*在某些文件中指定要复制的文件.txt *

时间:2014-10-17 16:12:34

标签: msbuild

我从文件中读取文件列表。我想复制并保留他们的文件夹结构 - 在文件名中看到(存在反斜杠或前锋),你是怎么做到的?简而言之,如果使用通配符获取文件名,则不会获得元数据。这些选项对我http://blogs.msdn.com/b/msbuild/archive/2005/11/07/490068.aspx不起作用,因为我正在从文件中读取我的filesToCopy。

例如files.txt包含

  

夹// test1.txt的
  文件夹/子文件夹/ subsubfolder / test1.txt的
  文件夹/子文件夹/的test2.txt

那么如何在不将所有文件展平为一个输出文件的情况下复制这些文件。

2 个答案:

答案 0 :(得分:0)

每行有一个文件。我认为它是源文件,目标基本目录是在别处指定的吗?我认为//并不重要,但说明可能由于将路径粘贴在一起而发生。

首先,您可以使用ReadLinesFromFile读取数据。您将填充每行一个项目的项目列表。所以要开始,

<Target Name="mikezcopy">
    <ReadLinesFromFile File="files.txt">
        <Output TaskParameter="Lines" ItemName="FileItem" />
    </ReadLinesFromFile>
    ⋮

现在我猜这些行是相对于源根的,你也给了一个目标根,就像命令行副本一样。每个副本的来源是列表中的一个FileItem,目的地是$(dest)\%(FileItem.Identity)。这给出了

的命令行副本(或xcopy?)
copy %(FileItem.Identity) $(dest)\%(FileItem.Identity)

可以与Exec任务一起使用,因为Copy任务不喜欢你可用的参数,但是cmd.exe拷贝内在很喜欢它们。

请注意,我将语法用于项列表的单个元素,因此包含该元素的任务本身将被批处理。我想你会得到相同的结果:

    ⋮
    <Exec Command="copy &quot;@(FileItem)&quot; &quot;$(dest)\%(Identity)&quot;" />

也就是说,列表的存在将导致整行被迭代,并且属性语法引用相同的当前迭代项。我没试过那条线,所以它可能不完全正确。使用Message使用相同的字符串来查看您的内容。

现在,我假设的是dest和源项关系吗?如果不完全,则需要更精确地表达排列,然后以合适的方式变换字符串而不是简单的连接$(dest)\%(Identity)。可以使用.Net CLR System.String函数和内置[MSBuild]::属性函数以及CLR中的其他类来进行字符串操作,您可以在其中获取正确传递的参数。如果它比这更复杂,你可以使用inline task并用C#或VB编写片段。

答案 1 :(得分:0)

您可以使用ReadLinesFromFiles(正确建议使用@ldlugosz),然后将MSBuild Copy taskMSBuild Transformations一起使用:

<Target Name="Build">
  <ReadLinesFromFile File="files.txt">
    <Output TaskParameter="Lines" ItemName="Files"/>
  </ReadLinesFromFile>

  <Copy SourceFiles="@(Files)" DestinationFiles="@(Files->'$(Outdir)%(relativedir)%(filename)%(extension)')" />
</Target>

$(Outdir)替换为您想要的任何目标文件夹。