XCOPY 스위치가 존재하지 않는 경우 지정된 디렉토리를 생성합니까?


78

빌드 후 이벤트에서 XCOPY를 사용하여 컴파일 된 DLL을 출력 폴더에서 메인 앱의 출력 폴더로 복사하고 있습니다. DLL은 다음과 같이 기본 앱 출력 폴더의 "Modules"하위 폴더에 복사됩니다.

xcopy  "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\" 

Modules 폴더가 있으면 명령이 제대로 작동하지만 테스트 중에 폴더가 없으면 XCOPY가 폴더를 만들지 않고 명령이 실패한다는 것을 발견했습니다.

폴더가없는 경우 생성되도록하는 XCOPY 스위치가 있습니까? 그렇지 않은 경우 폴더가없는 경우 폴더를 만들기 위해 빌드 후 이벤트에 무엇을 추가해야합니까? 당신의 도움을 주셔서 감사합니다.


허용 대답에 내 의견을 참조하십시오
데이비드 Veeneman

답변:


54

나는 이것을 사용하여 명령 줄에서 시도했다.

D:\>xcopy myfile.dat xcopytest\test\

대상 디렉터리가 제대로 생성되었습니다.

그렇지 않은 경우 의 명령 확장이 활성화 된 mkdir명령을 사용하여 대상 디렉토리를 만들 수 있습니다.cmd

cmd /x /c mkdir "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\"

( '/ X'들이이 시스템에 기본적으로 사용하지 않을 경우 명령 확장을 가능하게, 안 가진 것을 알고 있어요 cmd)

사용하다

cmd /? 
mkdir /?
xcopy /?

추가 정보 :)


13
나는 첫 번째 부분이 옳은 것으로 판명 되었기 때문에이 대답을 받아 들였습니다. XCOPY 디렉토리가 존재하지 않는 경우 생성합니다. Windows가 내 XCOPY 명령에 대해 덮어 쓰기 확인을 요청하는 것을 발견했습니다. VS는이를 허용하지 않으므로 코드 2로 종료했습니다. 프롬프트를 억제하는 / y 매개 변수를 추가하면 명령이 작동합니다. 솔루션을 청소하고 폴더를 삭제 한 다음 다시 빌드하여 테스트했습니다. XCOPY에 의해 폴더가 생성되었습니다.
David Veeneman 2011 년

@DavidVeeneman Windows 10의 VS2015에서는 작동하지 않습니다. "오류 : 잘못된 경로"메시지와 함께 xcopy 오류가 발생합니다. 그래서 안돼. XCOPY는 하지 않습니다 (항상) 대상 디렉토리 생성
톰 린트

3
XCOPY는 디렉토리를 생성하지만 모호성이없는 경우에만 생성합니다. 이것은 모호합니다. D : \> xcopy myfile.dat xcopytest \ test 이것은 다음이 아닙니다. D : \> xcopy myfile.dat xcopytest \ test \ ( 마지막 '\'에주의)
azog

120

"/ I"사용에 대한 대답은 작동하지만 약간의 트릭이 있습니다. 대상에서 \ 문자로 끝나야 대상이 파일이 아니라 디렉토리임을 xcopy에 알릴 수 있습니다!

예:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder" /F /R /Y /I

작동하지 않고 코드 2를 반환하지만 이것은 다음과 같습니다.

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder\" /F /R /Y /I

내 샘플에 사용 된 명령 줄 인수 :

/ F-전체 소스 및 대상 파일 이름을 표시합니다.

/ R-읽기 전용 파일을 덮어 씁니다.

/ Y-기존 파일을 덮어 쓸지 묻는 메시지를 표시하지 않습니다.

/ I-대상이 디렉토리라고 가정합니다 (그러나 \로 끝나야 함).


4
사용 /F이유 /R, 이유 , 이유를 자세히 설명하면 대답이 더 유용 할 것 /Y입니다. 제 경우에는 /Y문제가 해결되었고 미래의 독자는 인터넷에서 데이터 마이닝없이 이유를 아는 것이 도움이 될 것입니다.
Orionii 황제

두 개의 디렉토리를 생성해야하는 경우 어떻게합니까? xcopy가 나를 대신 할 수 있습니까?
Pedro77 2013-10-04

3
제 경우 /I에는 디렉토리를 조건부로 생성하는 데 필요한 것이 아니라 백 슬래시로 경로를 끝내기 위해 +1이 필요했습니다.
Kent Weigel

15

저는 PostBuild 단계가 싫습니다. 빌드 도구의 범위 밖에서 너무 많은 일이 발생할 수 있습니다. MSBuild가 복사 프로세스를 관리하고 업데이트하는 것이 더 낫다고 생각합니다. 다음과 같이 .csproj 파일을 편집 할 수 있습니다.

  <Target Name="AfterBuild" Inputs="$(TargetPath)\**">
    <Copy SourceFiles="$(TargetPath)\**" DestinationFiles="$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\**" OverwriteReadOnlyFiles="true"></Copy>
  </Target>

1
입력, SourceFiles 및 DestinationFiles가 올바르지 않다고 생각합니다. 그는 DDL을 모듈 폴더에 복사하고 있습니다.
Fun Mun Pieng 2011 년

어쨌든 속성 그룹에 추가하겠습니다.
Ritch Melton 2011 년

1
Inputs = "..."를 제거해야합니다. VS 2012에서 ""AfterBuild "대상에 출력 사양이 없습니다. 대상이 입력을 선언하면 출력도 선언해야합니다."라는 오류가 발생합니다.
angularsen

$ (TargetPath)는 출력 .DLL 파일의 파일 경로이므로 SourceFiles 값에서 \ **도 제거해야합니다.
angularsen

Inputs = ""를 제거하면 빌드 추적이 손실됩니다. 이것은 2 년 된 질문입니다. 업데이트하고 싶으시면 부담없이 말씀해주세요.
Ritch Melton 2013

15

xcopy와 함께 / i를 사용하고 디렉토리가 존재하지 않으면 디렉토리가 생성됩니다.


6

robocopy를 사용할 수 있습니다.

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules" /E

+1 : Vista 및 Win7에서 사용할 수있는 robocopy 명령에 대해 몰랐습니다. 감사. 하지만 여기서 작동 할 것이라고 생각하지 마십시오. 폴더가 아닌 파일을 복사하고 있습니다.
David Veeneman 2011 년

나는 robocopy에 대해서도 몰랐다. 알아두면 좋지만 안타깝게도 Program Files 아래의 폴더에 복사 할 경우 "액세스가 거부되었습니다"라는 메시지와 함께 실패합니다. (xcopy는이 문제를 가지고 있지 않습니다.)
톰 도깨비

추가 연구에서 xcopy는 새 파일을 Program Files 아래의 기존 폴더에 복사하는 것이 좋을 것 같지만 분명히 새 폴더를 만들 수 없습니다 (관리자 권한없이).
Tom Bogle 2016 년

1

나는 이것을 명령에 시도했다.

if "$(OutDir)"=="bin\Debug\"  goto Visual
:TFSBuild
goto exit
:Visual
xcopy /y "$(TargetPath)$(TargetName).dll" "$(ProjectDir)..\Demo"
xcopy /y "$(TargetDir)$(TargetName).pdb" "$(ProjectDir)..\Demo"
goto exit
:exit

1

간단한 짧은 대답은 다음과 같습니다.

xcopy /Y /I "$(SolutionDir)<my-src-path>" "$(SolutionDir)<my-dst-path>\"

0

/ E 시도

전체 옵션 목록을 얻으려면 : xcopy /?


감사합니다. / e는 소스의 기존 하위 디렉토리 구조를 복사하기위한 것입니다. 원본 루트의 파일을 대상의 새 하위 디렉터리로 복사하고 있습니다.
David Veeneman 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.