2014-10-17 63 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