2014-10-17 136 views
0

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

如files.txt包含

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

因此,如何能我复制这些文件,而不是将它们全部压缩为一个输出文件。

回答

0

每行有一个文件。我认为这是源文件,目标基目录是在其他地方指定的?我认为//并不重要,但说明它可能是由于粘贴路径而发生的。

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

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

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

copy %(FileItem.Identity) $(dest)\%(FileItem.Identity) 

这可能与Exec任务中使用的命令行复制(或XCOPY?),因为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中编写片段。

+0

非常感谢。我宁愿保持它在msbuild虽然:) – Menzi 2014-11-05 14:59:04

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)与任何你想要的目标文件夹。

+0

工作,就像一个魅力! :) – Menzi 2014-11-05 14:58:27