2011-12-06 258 views
24

好吧,我是一個PHP程序員,不幸的是,對於原因,我不會宣佈爲簡便起見,我需要寫/使用處理一些圖像,我一個批處理文件。Windows批處理文件循環通過目錄處理文件?

我有一個完整的嵌套的文件夾的文件夾,內部的每個這些嵌套的文件夾是一個更包含數TIF圖像的文件夾中,圖像的數量每個文件夾中而變化。我也有一個批處理文件,讓我們把它叫做ProcessImages.bat用於Windows,你可以「滴」這些TIF文件(或明顯調用蝙蝠時在命令行列表中指定它們);在此基礎上創建一個新的文件夾與我所有的圖像處理基於我有一個EXE。

好的是,因爲bat文件使用從「放置」到其上的文件夾的路徑,所以我可以選擇一個文件夾的所有TIF並將其放到進行處理中......但隨着我繼續手工做的TIFS我有我發現的300頁左右的文件夾就停滯不前我的系統下如此令人難以置信,如果我只能處理這些一次一個(沒有做手工),這將是美好的。

所有這些說......有人能夠以正確的方向指向我(對於Windows的bat文件AMATEUR),我可以編寫一個Windows bat腳本,我可以從一個目錄中調用並讓它遍歷ALL包含在該目錄內的目錄......並在每個圖像集上一次運行我的處理批處理文件?

在此先感謝!

泰勒

回答

67

你可以寫在批遞歸算法,讓你的你在每一個嵌套的子目錄做精確控制:

@echo off 
call :treeProcess 
goto :eof 

:treeProcess 
rem Do whatever you want here over the files of this subdir, for example: 
for %%f in (*.tif) do echo %%f 
for /D %%d in (*) do (
    cd %%d 
    call :treeProcess 
    cd .. 
) 
exit /b 
+0

謝謝@Aacini!說得好!我已經開始研究類似的東西,但沒有得到任何...我需要這個來看看它是如何工作的;並且對此代碼進行快速測試表明它的工作方式與預期完全相同。 – Tyler

+1

@Aacini。你還可以解釋/評論這些/ D,%% f命令做什麼?那太好了 ! – Dexters

+2

你可以在下面的URL中找到更多的語法。 http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx?mfr=true –

42

Aacini的解決方案作品,但你可以在一行做到這一點:

for /R %%f in (*.tif) do echo "%%f" 
+0

不知道多少年後,但我仍然使用這一個! – Tyler

+0

我正在使用它,出於某種原因,它爲目錄樹中的每個文件執行命令,而不僅僅是那些具有我指定的擴展名的命令。 –

+2

正如我所說的,我的方法可精確控制您在每個子目錄中執行的操作。如果這個過程需要一定的順序(例如,先移動文件然後刪除空的子目錄),那麼使用'for/R'就不能實現... – Aacini

1

因爲它似乎是關於這種情況下最受歡迎的問題發佈在這裏。

這是我終於在網上找回的老寶石:sweep.exe
它在當前目錄和所有子目錄中執行提供的命令,就這麼簡單。


讓我們假設你有一些程序,處理目錄中的所有文件(但使用情況真的比這要廣泛得多):

For example, a file C:\Commands\processimages.cmd which contains: 
FOR %%f IN (*.png) DO whatever 

所以,你想運行此程序在當前目錄和所有子目錄:

:: Put sweep.exe in your PATH, you'll love it! 
C:\ImagesDir> sweep C:\Commands\processimages.cmd 

:: And if processimages.cmd is in your PATH too, the command becomes: 
C:\ImagesDir> sweep processimages 


優點:你不必改變原來的計劃,使我t處理子目錄。只有在需要時纔可以選擇處理子目錄。這個命令使用起來非常簡單而且令人愉快。

Con:可能會失敗並顯示一些命令(包含空格,引號,我不知道)。例如,請參閱this thread

+0

這真棒! – Tyler

2

我知道這是不是遞歸(迭代至枚舉子目錄?),但它可能對某些應用更好:

for /F "delims=" %%i in ('dir /ad /on /b /s') do (
    pushd %%i 
    dir | find /i "Directory of" 
    popd 
) 

用您可能需要的任何命令替換第3行。

DIR /廣告 - 只列出目錄

很酷的事情是PUSHD不需要引號如果空間路徑。