2015-10-26 71 views
2

我的文件夾一樣E:\Backups\code\Hazard\test1 ... testn爲什麼循環沒有按預期運行?

而且這些測試文件夾類似E:\Backups\code\Hazard\test1\it0內... itn

根文件夾是從代碼運行在那裏E:\Backups\code

下面的代碼在每個子文件夾上運行並將summary.ymlit0文件夾複製到最新的it(n)文件夾。

爲什麼代碼只爲test1文件夾運行,然後掛起?

setlocal ENABLEDELAYEDEXPANSION 

set root=%cd% 
for /D %%X in (%root%\*) do (
    echo %%X 
    cd %%X 

    for /D /r %%b in (*) do ( 
     cd %%b 

     echo %%b 

     for /f "tokens=1,2,*" %%a in ('robocopy . . file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs ^| sort /r') do set "lastFolder=%%~dpc" & goto :done 
:done 
     echo Last folder : %lastFolder% 

     for /d %%j in (*) do (
      if /i "%%~nj"=="it0" COPY %%j\summary.yml %lastFolder% 
     ) 
     cd .. 
    ) 
) 
+0

GOTO打破了FOR構造。 – Squashman

+0

感謝Mofi和Squashman的迴應。 @ Mofi Yesh在我的代碼中,一切從一行開始,當我粘貼到這個站點時,它分成多行。我是批量編程的新手,很難像VBA或其他人一樣對編碼風格進行映射。我會盡力按你的建議去做。謝謝。 – bob

+0

@Mofi,不,從**到**到**的所有內容都不需要在同一行上。 –

回答

1

有在代碼兩個主要問題:

  • 如果goto使用內部循環,取消循環
  • 如果您在代碼塊內部(代碼在括號內)設置變量,要在相同的代碼塊內檢索變量的值,您需要延遲擴展,使用setlocal enabledelayedexpansion啓用它並更改用於從%var%!var!中檢索變量中的值的語法。

但是

  • goto可以如previous answer指示被移除,無需
  • 延遲擴展。而不是存儲在變量中從for替換參數的值的,只要使用可替換的參數

沒有測試,但是更多或更少的

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem E:\Backups\ code \ Hazard \ test1 \ it0 ... itn 
    rem    ^root ^%%X ^%%Y   ^%%~dpc 

    for /D %%X in ("*") do for /D %%Y in ("%%~fX\*") do for /f "tokens=1,2,*" %%a in (' 
     robocopy "%%~fY." "%%~fY." file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs 
     ^| sort /r 2^>nul 
     ^| cmd /q /v /c "(set /p .=&echo(!.!)" 
    ') do copy "%%~fY\it0\summary.yml" "%%~dpc." 

作爲E:\Backups\code當前活動目錄:

  • %%X將枚舉E:\Backups\codeHazard
  • %%Y將列舉下E:\Backups\code\Hazardtestn
  • %%a文件夾執行robocopy命令來查找該文件夾包含最新file.txt文件
  • sort /r各種各樣的文件列表按降序排列,因此最新的文件在列表中的第一個
  • cmd檢索並僅輸出第一行
  • 隨着在幾個for可替換參數的所有可用信息,執行所指示的copy命令。
1

我不知道有關與ROBOCOPY行應該做的事情。它看起來像這個命令是爲了獲取當前目錄中最後一個子目錄的名稱。

也許這個代碼效果更好。但我無法測試它。

setlocal EnableDelayedExpansion 
set "root=%cd%" 

for /D %%X in ("%root%\*") do (
    echo %%X 
    cd "%%~X" 

    for /D /r %%b in (*) do (
     cd "%%~b" 
     echo %%b 

     call :GetLastFolder 

     echo Last folder : !lastFolder! 

     for /d %%j in (*) do (
      if /i "%%~nj"=="it0" copy "%%j\summary.yml" "!lastFolder!" 
     ) 
     cd .. 
    ) 
) 
goto :EOF 

:GetLastFolder 
for /f "tokens=1,2,*" %%a in ('robocopy . . file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs ^| sort /r') do set "lastFolder=%%~dpc" & goto :EOF 
goto :EOF 

它至少需要引用環境變量lastFolder用感嘆號,而不是百分號真正使用延遲擴張需要在這裏。

goto :EOF退出子程序,導致繼續在call :GetLastFolder以下的行。

有必要後主代碼以避免後最外循環完成子例程的代碼被執行一次多一個goto :EOF或備選地exit /B。此goto :EOF導致退出此批處理文件的處理。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中至少執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • call /?
  • for /?
  • goto /?
  • set /?
+0

@ MC ND你搖滾! :)再次解決了我的問題。感謝Mofi給你的時間。欣賞它。 MC ND的代碼適用於我,解決了我目前的問題。學習新事物。感謝噸你們:) – bob

+0

@ Mofi,你的代碼也可以。謝謝大家的幫助。 – bob