2011-12-06 352 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不需要引号如果空间路径。