2011-08-05 3 views
0

미리 정의 된 폴더의 각 하위 폴더를 ftp를 통해 원격 서버로 전송하는 배치 스크립트를 작성하고 있습니다.루프 일괄 처리 스크립트가 작동하지 않고 루프 만 수행

모든 것이 정상적으로 작동하지만 for 루프에서는 한 번만 실행되고 하나의 폴더 만 전송 한 다음 루프를 나눕니다. 나는 "에코"와 같은 루프에 대한 몇 가지 짧은 코드를 사용할 때

내가 루프

FOR /f "delims= " %%B IN ('DIR "%backup_dir%" /A:D /B') DO (

    here is my code 

) 

의 코드를 잔뜩 가지고 올바르게 실행됩니다. 하지만 ftp 명령으로 많은 코드를 넣을 때가 아닙니다. 이러한 ftp 코드는 올바르게 실행될 수 있지만 한 번만 실행하면 루프가 나옵니다. 아래

의 코드 조각은 어떤 의견을 환영 루프

REM -- Send most recent daily backups offsite 
IF !daily_flag! EQU YES (
    ECHO -- Starting Daily backups for !current_folder! 
    ECHO. 
    CD 1DAYS_OLD\ 

    REM -- Start entries for ftp commands file 
    ECHO user %login% %pass% > %ftp_cmds1% 
    ECHO cd backup/files/!current_folder!/1DAYS_OLD >> %ftp_cmds1% 
    ECHO quit >> %ftp_cmds1% 

    SET go_flag=NO 
    SET /a ftp_cntr=0 
    REM -- Loop to see if offsite backup server is alive 
    :CHECK_FTP1 
    IF !go_flag! EQU NO (
     ECHO %ftp_cmds1% > %ftp_dbg1% 
     ftp -ind -s:%ftp_cmds1% %machine_ip% > %ftp_dbg1% 

     REM -- Check ftp debug file to decide what to do 
     FIND /i "Not connected" %ftp_dbg1% 
     IF !ERRORLEVEL! EQU 0 (
      ECHO *** Unable to connect to offsite backup machine: %machine_ip% at %DATE% 
      ECHO !ftp_cntr! 
      IF !ftp_cntr! GTR 10 (
       ECHO *** Unable to connect to offsite backup machine: %machine_ip% for 10 minutes from %machine% 
       ECHO ----- Start ftp debug file 
       TYPE %ftp_dbg1% 
       ECHO ----- End ftp debug file 
       DEL /f /q %lock_file% 
       DEL /f /q %ftp_cmds1% 
       DEL /f /q %ftp_dbg1% 
       EXIT 2 
      ) ELSE (
       TIMEOUT /t 60 
       SET /a ftp_cntr+= 1 
      ) 
     ) ELSE (
      SET go_flag=YES 
      ECHO Offsite backup machine is alive, proceeding with ftp 
     ) 
     GOTO :CHECK_FTP1 
    ) 

    FIND /i "No such file or directory" %ftp_dbg1% 
    IF !ERRORLEVEL! EQU 0 (
     ECHO * Directory backup/files/!current_folder! does not exist on offsite backup machine. 
     SET go_flag=MKDIR 
    ) 

    REM -- IF %go_flag% == MKDIR create remote directory structure 
    IF !go_flag! EQU MKDIR (
     REM -- Start entries for ftp commands file 
     ECHO user %login% %pass% > %ftp_cmds2% 
     ECHO cd ~/backup/files/ >> %ftp_cmds2% 
     ECHO mkdir !current_folder! >> %ftp_cmds2% 
     ECHO cd !current_folder! >> %ftp_cmds2% 
     ECHO mkdir 1DAYS_OLD >> %ftp_cmds2% 
     ECHO mkdir 2DAYS_OLD >> %ftp_cmds2% 
     ECHO mkdir 3DAYS_OLD >> %ftp_cmds2% 
     ECHO mkdir 4DAYS_OLD >> %ftp_cmds2% 
     ECHO mkdir 5DAYS_OLD >> %ftp_cmds2% 
     ECHO mkdir 6DAYS_OLD >> %ftp_cmds2% 
     ECHO mkdir 7DAYS_OLD >> %ftp_cmds2% 
     ECHO ls -lart >> %ftp_cmds2% 
     ECHO quit >> %ftp_cmds2% 

     ftp -ind -s:%ftp_cmds2% %machine_ip% > %ftp_dbg2% 
     ECHO + Directory structure backup/files/!current_folder! created on offsite backup machine: %machine_ip% 
    ) 

    REM -- FTP to offsite backup machine and begin FTP transfer 
    ECHO user %login% %pass% > %ftp_cmds3% 
    ECHO binary >> %ftp_cmds3% 
    ECHO cd ~/backup/files/!current_folder!/7DAYS_OLD >> %ftp_cmds3% 
    ECHO mdelete * %ftp_cmds3% 
    ECHO cd .. >> %ftp_cmds3% 
    ECHO rmdir 7DAYS_OLD >> %ftp_cmds3% 
    ECHO rename 6DAYS_OLD 7DAYS_OLD >> %ftp_cmds3% 
    ECHO rename 5DAYS_OLD 6DAYS_OLD >> %ftp_cmds3% 
    ECHO rename 4DAYS_OLD 5DAYS_OLD >> %ftp_cmds3% 
    ECHO rename 3DAYS_OLD 4DAYS_OLD >> %ftp_cmds3% 
    ECHO rename 2DAYS_OLD 3DAYS_OLD >> %ftp_cmds3% 
    ECHO rename 1DAYS_OLD 2DAYS_OLD >> %ftp_cmds3% 
    ECHO mkdir 1DAYS_OLD >> %ftp_cmds3% 
    ECHO cd 1DAYS_OLD >> %ftp_cmds3% 
    ECHO mput * >> %ftp_cmds3% 
    ECHO quit >> %ftp_cmds3% 

    ECHO ---- Starting Daily FTP at: %DATE% 
    ftp -ind -s:%ftp_cmds3% %machine_ip% > %ftp_dbg3% 

    REM -- Go up a directory in case you have to next process weekly backups 
    CD.. 
    CD 
    ECHO ---- Finished Daily backups at: %DATE% 
    ECHO. 
    ECHO. 
) 
에 대한

로 이동합니다!

+1

이'ftp' 것은 배치 파일이 아니겠습니까? @Andriy가 지적한대로 –

+1

에서 코드에 BAT 파일 호출이있을 수 있습니다. 코드를 여러 조각으로 나누고 ('CALL'명령 사용), 범인을 찾을 때까지 한 번에 한 단계 씩 디버그하십시오. –

+0

@PA에 감사드립니다. 지금 당장 제가하는 일입니다. 그리고이 문제는 ftp 코드 부분에 있습니다. 그 부분이 없으면 루프가 정상적으로 실행되지만 그 부분 자체가 올바르게 실행될 수 있으므로 문제를 정확히 지적 할 수 없습니다. – yangqi

답변

2

FOR 명령은 GOTO를 실행하면 취소됩니다. 이 문제를 해결하려면 FOR 명령에서 서브 루틴을 호출하고 서브 루틴 (goto 포함)에서 원하는 모든 프로세스를 수행하십시오.

+0

정답이지만 Andriy M은 의견에서 7 시간 일찍 동일한 대답을 제공했습니다. –

+0

실례 합니다만, "FOR 명령은 GOTO를 실행하면 취소됩니다"(이는 문제의 원인 임) "FOR 명령의 서브 루틴을 호출하지 말고 모든 프로세스를 수행합니다 서브 루틴에서 원한다 "(문제를 해결하는 방법). 그는 방금 CALL 명령의 작동을 설명했습니다. 아마도 나는 뭔가를 놓쳤을 까? – Aacini

+0

나는 "같은 대답"이라고해서는 안된다. 같은 문제, 다른 원인. 그는 OP가 CALL 명령을 사용하지 않고 다른 배치 파일을 호출함으로써 첫 번째 배치 파일 (루프가 아님) 전체를 종료 함을 지적했습니다. 같은 효과지만 다른 원인이 있지만 CALL을 사용하지 않으면 더 즉각적인 문제입니다. 그것은 GOTO 이전에 발생합니다. OP의 배치 파일이 깨져있는 두 가지 방법이 있습니다. 두 사람 모두 답변에 대한 크레딧을받을 수 없다는 것은 너무 나쁘다. –