2011-02-25 6 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

답변

42

SourceFiles에 대해 명시 적으로 ItemGroup을 지정하십시오.

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

_CopyItems는 항목 유형이므로 '$'대신 '@'기호를 사용하여 참조됩니다.

+1

' false'을 항목 그룹에 더 좋게 추가하십시오. 그렇지 않으면 솔루션 탐색기에 모든 bin 폴더 내용이 표시됩니다. ' <_CopyItems는 = "$ (TARGETDIR) *을. *"포함> 거짓 ' – Zelenov

12

MSDN 설명서를 보면 SourceFiles 매개 변수에 ITaskItem [] 값이 필요하다고 생각합니다. MSDN MSBuild Copy Task

위 링크의 마지막 예는 폴더 구조를 유지하면서 한 디렉토리에서 다른 디렉토리로 재귀 복사를하는 것입니다.

+1

이 답변을 더 자세하게 작성해야합니다. – Nitij

+0

@Nitij - 나는 내 역할을 수행했다! 그것은 훌륭한 대답입니다. 1232 개가 넘는 링크를 통해 끝났습니다. – jleach

12

복사 파일은 바이러스 백신 프로그램 및 하위 디렉토리가 대상 디렉토리의 하위 폴더에 소스 디렉토리의 하위 폴더를 배치 할 수 있도록, 하위 폴더를 존중 복사에게 작업을 요청합니다 $(OutputPath)\%(RecursiveDir) 지정

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

를 처리하는 다음 코드로 수행 할 수 있습니다 .

SkipUnchangedFiles은 RAM이 충분할 때 자주 사용하는 파일에 대해 IO가 IO를 최적화하므로 메모리가 충분한 컴퓨터에서 빌드 속도가 빨라집니다. 빌드 할 때

RetriesRetryDelayMilliseconds는 SSD 드라이브가 거의 경우 B) 바이러스 백신 소프트웨어에서 실패하지 않습니다, 가) 압축 된 NTFS 파일 시스템 관련 문제를 처리합니다.

+0

어떤 경로 \의 % (RecursiveDir)에'DestinationFolder' 설정의 파급 효과는? 그것은 의도 된 위치에 디렉토리를 놓거나, 재귀 경로를 따라 가장 멀리 떨어져있는 것입니다. –

+1

kayleeFrye_onDeck, 소스 디렉토리의 하위 폴더에 하위 디렉토리를 배치합니다. 제거하려면 원본 디렉토리의 모든 하위 폴더 내용이 배치됩니다. 대상 디렉토리로. –

+1

고마워, @ drweb86! –

관련 문제