2011-08-05 193 views
0

我正在寫一個批處理腳本通過ftp將預定義文件夾的每個子文件夾傳輸到遠程服務器。批處理腳本for循環不工作,只循環一次

一切工作正常,但在for循環中,它只執行一次,只傳輸一個文件夾,然後打破循環。

我在一堆代碼迴路

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

    here is my code 

) 

當我在使用一些簡短的代碼迴路,如「回聲」,它正常運行。但是,當我用ftp命令放入一堆代碼時不行。這些ftp代碼可以正確運行,但只能運行一次,然後打開循環。

下面

是一段代碼在for循環

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

如果您在其中執行任何GOTO,FOR命令將被取消。爲了解決這個問題,在FOR命令中調用一個子程序,並在子程序中執行你想要的任何程序(包括goto的)。

+0

正確的答案,但Andriy M在7小時前的評論中提供了相同的答案。 –

+0

對不起,但我沒有看到任何提及「FOR命令被取消,如果您在其中執行任何GOTO」(這是問題的原因)既沒有「在FOR命令中調用子例程並執行任何進程想要在子程序中「(這是解決問題的方法)。他只是解釋了CALL命令的操作。也許我錯過了什麼? – Aacini

+0

我不應該說「相同的答案」。同樣的問題,不同的原因。他指出OP在不使用CALL命令的情況下調用另一個批處理文件,從而終止整個第一批文件(不僅僅是循環)。同樣的效果,但不同的原因,但不使用CALL是更直接的問題。它發生在GOTO之前。你們都找到了OP的批處理文件被破壞的兩種不同的方式。太糟糕了,你們倆都不可能得到答案。 –