每行有一个文件。我认为这是源文件,目标基目录是在其他地方指定的?我认为//
并不重要,但说明它可能是由于粘贴路径而发生的。
首先,您可以使用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 "@(FileItem)" "$(dest)\%(Identity)"" />
也就是说,列表的存在会导致整条生产线进行迭代,并且属性语法指的是同当前迭代项。我没有试过这条线,所以它可能不完全正确。使用Message
使用相同的字符串来查看您获得的内容。
现在,我认为是dest和源项目关系吗?如果不是很完美,你需要更精确地表达这种安排,然后以合适的方式对字符串进行变形而不是简单的连接$(dest)\%(Identity)
。使用.Net CLR System.String函数和内置的[MSBuild]::
属性函数以及CLR中的其他类可以进行字符串操作,您可以在其中获取参数以正确传递。如果它比这更复杂,则可以使用inline task并在C#或VB中编写片段。
非常感谢。我宁愿保持它在msbuild虽然:) – Menzi 2014-11-05 14:59:04