2014-02-27 2 views
0

내가있는 Robocopy자동화 삼바는 배치 스크립트

스크립트는 아래의 작업 표시하지만이 단계에서 완전하게 테스트 할 수 없습니다를 사용하여 신뢰할 수 삼바 공유에 파일을 복사하고있어 함께 공유 수준에 복사합니다.

  1. 가 나는 그것이 대상의로 ROBOCOPY 적어도 \\host\share이 있어야 것으로 나타났습니다 ROBOCOPY

    에서 공유 수준에서 복제 할 수 없습니다

    은 정말 두 가지 질문이 있습니다. 방금 \\host을 사용하면 ERROR 161이 발생합니다. 기본적으로 동일한 폴더에 여러 개의 폴더를 복제하려고합니다. 예를 들어 내 소스 폴더는 다음과 같습니다 :

    E:\Root\Folder1\File1 
    E:\Root\Folder2\File2 
    E:\Root\Folder3\File3 
    

    나는 내 소스에서

    \\asambashare\Folder1\File1 
    \\asambashare\Folder2\File1 
    \\asambashare\Folder3\File1 
    

    에이 모든 것을 복사 할, Folder1은 단순히 폴더하지만 내 삼바 대상에 Folder1입니다 실제로 몫.

    각 공유에 대해 robocopy를 실행하여이 문제를 해결하려고합니다.

    나는 오히려 폴더를 반복하거나 robocopy가 모든 폴더의 이름을 명시 적으로 지정하는 대신이 방법을 사용하도록 설득하는 방법을 찾고 있습니다. 내 목적을 위해

    ROBOCOPY

    에 대한

  2. 신뢰성 리턴 코드는 7 오류 수준 아래 ROBOCOPY에서 잘하고 배치 스크립트는 0

    첫째

    내 현재 코드가 그렇게되어 반환해야?

    두 번째로 robocopy를 여러 번 호출하면 각 호출 후에 간단히 IF ERRORLEVEL... 코드를 반복 할 수 있습니까? 아무리해도 하나라도 실패하면 스크립트는 1을 리턴해야한다.

    나는 내가 가지고있는 것이 꽤 가깝다고 믿는다. 그러나 누군가가 확실하게 대답한다면 그것은 나에게 많은 테스트를 줄 것이다.

    REM target must be of the format \\host\share. 
    REM Simplest way to do this is list out each combination manually 
    REM Afer calling ROBOCOPY, set Exitcode. 
    REM If at least one copy returns 8 or higher, this batch file returns 1. 
    REM Otherwise it returns 0 
    
    
    SET LOGFILE=E:\SambaReplication.LOG 
    SET SRC=E:\Root\asambashare 
    SET TGT=\\asambashare 
    SET EXITCODE=0 
    
    
    ROBOCOPY %SRC%\Folder1 %TGT%\Folder1 /S /MOV /R:20 /W:600 /V /FP /LOG+:%LOGFILE% 
    IF ERRORLEVEL 8 SET EXITCODE=1 
    
    ROBOCOPY %SRC%\Folder2 %TGT%\Folder2 /S /MOV /R:20 /W:600 /V /FP /LOG+:%LOGFILE% 
    IF ERRORLEVEL 8 SET EXITCODE=1 
    
    ROBOCOPY %SRC%\Folder3 %TGT%\Folder3 /S /MOV /R:20 /W:600 /V /FP /LOG+:%LOGFILE% 
    IF ERRORLEVEL 8 SET EXITCODE=1 
    
    
    
    EXIT %EXITCODE% 
    

답변

1

사용 for 명령은 폴더의 표시 목록을 반복합니다.

SETLOCAL ENABLEEXTENSIONS 

SET "LOGFILE=E:\SambaReplication.LOG" 
SET "SRC=E:\Root\asambashare" 
SET "TGT=\\asambashare" 
SET "EXITCODE=0" 

FOR %%F IN (Folder1 Folder2 Folder3) DO (
    ROBOCOPY "%SRC%\%%F" "%TGT%\%%F" /S /MOV /R:20 /W:600 /V /FP /LOG+:"%LOGFILE%" 
    IF ERRORLEVEL 8 SET "EXITCODE=1" 
) 

ENDLOCAL & EXIT /B %EXITCODE% 

그리고 %SRC% 아래의 모든 디렉토리를 복사 할 경우, 대신 목록에 열거의 단지 폴더

FOR /D %%F IN ("%SRC%\*") DO (
    ROBOCOPY "%%~fF" "%TGT%\%%~nxF" /S /MOV /R:20 /W:600 /V /FP /LOG+:"%LOGFILE%" 
    IF ERRORLEVEL 8 SET "EXITCODE=1" 
) 

`%%~fF` is the full path of the folder referenced by `%%F`, and 
`%%~nxF` is the name and extension (if it has) of the folder referenced by `%%F` 
의 목록을 검색 할 for /d를 사용
+0

우수! 그게 완벽하게 작동합니다. 내가 할 수 있으면 하나의 작은 질문. 나는 로그 파일이 항상 같은 폴더에 있고 가능한 경우 배치 파일과 같은 이름을 갖고 싶습니다. 그래서 로그를 하드 코딩하는 대신 가능하면 배치 경로와 이름을 선택하기 위해 마법의 몇 개를 사용하고 싶습니다. 그것에 대한 몇 가지 유효한 코드를 제안 해 주시겠습니까? –

+0

@ElectricLlama,'SET "LOGFILE = % ~ dpn0.log'''% 0'는 현재 배치 파일에 대한 참조이므로 '% ~ dpn0'은 현재 배치 파일의 확장자가없는 드라이브, 경로 및 파일 이름입니다. –