2011-02-25 50 views
28

試圖複製整個文件夾,但是當我這樣做:MSBUILD拷貝整個文件夾

<Copy SourceFiles="$(TargetDir)\*.*" DestinationFolder="$(BuildOutput)\SomeDir" /> 

副本試圖做到這一點:複製c:\源\ *。* C:\目標\ SomeDir \ *。*和失敗,「非法字符」

+1

類似的問題已經在這裏問:http://stackoverflow.com/questions/119271/copy-all-files-and-folders-using-msbuild – joshhendo 2011-02-25 23:07:04

回答

42

明確指定您的SourceFiles的ItemGroup。

<ItemGroup> 
    <_CopyItems Include="$(TargetDir)\*.*" /> 
</ItemGroup> 
<Copy 
    SourceFiles="@(_CopyItems)" 
    DestinationFolder="$(BuildOutput)\SomeDir" 
    /> 

請注意_CopyItems是一個項目類型,因此它使用'@'符號而不是'$'引用。

+1

清盤最好加''到項目組,否則你會看到在解決方案資源管理所有的bin文件夾中的內容。 ' <_CopyItems包括= 「$(TARGETDIR)*。*」> ' – Zelenov 2016-09-20 10:27:38

12

望着MSDN文檔,我相信SourceFiles參數需要一個ITaskItem []值。見上面的鏈接MSDN MSBuild Copy Task

最後一個例子是從一個目錄到另一個做遞歸複製,保持文件夾結構。

+1

這個答案需要upvoted更多。 – Nitij 2015-12-08 13:19:00

+0

@Nitij - 我盡了我的努力!這是一個很好的答案,已經通過十幾人之前,我在那個鏈接 – jleach 2017-07-13 14:47:13

12

複製文件可以用下面的代碼片段它處理的防病毒程序和子目錄

<ItemGroup> 
     <SomeAppStuff Include="$(SolutionDir)\ProjectXXX\bins\**\*.*" /> 
    </ItemGroup> 
    <Copy 
     SourceFiles="@(SomeAppStaff)" 
     DestinationFolder="$(OutputPath)\%(RecursiveDir)" 
     SkipUnchangedFiles="true" 
     OverwriteReadOnlyFiles="true" 
     Retries="3" 
     RetryDelayMilliseconds="300"/> 

指定$(OutputPath)\%(RecursiveDir)會要求複製任務尊重的子文件夾,因此它將把源代碼目錄的子文件夾到目標目錄的子文件夾來完成。

SkipUnchangedFiles將增加足夠的內存的計算機上生成速度,因爲Windows優化IO爲經常使用的文件時,有足夠的RAM。

RetriesRetryDelayMilliseconds處理相關 一)壓縮的NTFS文件系統的問題,建立時很少在情況下b)防病毒軟件與SSD硬盤。

+0

什麼'DestinationFolder'設置路徑\%(RecursiveDir)的後果?它將把該目錄在預定位置,或無論是最遠的向下遞歸尋路, – 2016-07-01 19:31:46

+1

kayleeFrye_onDeck,它將把源代碼目錄的子文件夾在目標目錄中的子文件夾,如果刪除,源目錄的所有子文件夾的內容將被放置到目的地目錄。 – 2016-07-01 21:13:37

+1

謝謝,@ drweb86! – 2016-07-01 21:25:05