Windows批处理文件通过目录循环处理文件?

时间:2011-12-06 09:27:31

标签: windows recursion batch-file

好的,我是一名PHP程序员,不幸的是,由于我不会为了简洁而宣布的原因,我需要编写/使用批处理文件为我处理一些图像。

我有一个装满嵌套文件夹的文件夹,每个嵌套文件夹中都有一个包含多个TIF图像的文件夹,每个文件夹中的图像数量各不相同。我也有一个批处理文件,让我们称它为ProcessImages.bat for Windows,你可以“删除”这些TIF文件(或者显然在调用bat时在命令行列表中指定它们);在此基础上创建一个新文件夹,我的所有图像都基于我拥有的EXE进行处理。

好处是,因为bat文件使用你“删除”的文件夹中的路径,我可以选择一个文件夹的所有TIF并将其删除以进行处理...但是我继续手动为300个左右的TIF文件夹执行此操作我发现它让我的系统陷入困境如此令人难以置信,如果我一次只能处理这些文件(无需手动操作),那就太棒了。

所有这些......可能有人指出我正确的方向(对于Windows bat文件AMATEUR),我可以编写一个Windows bat脚本,我可以从目录中调用并让它遍历所有该目录中包含的目录...并在每组图像上一次运行我的处理批处理文件?

提前致谢!

泰勒

5 个答案:

答案 0 :(得分:85)

您可以在Batch中编写一个递归算法,它可以精确控制您在每个嵌套子目录中执行的操作:

@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

答案 1 :(得分:55)

Aacini的解决方案有效但您可以在一行中完成:

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

答案 2 :(得分:2)

在此处发布,因为它似乎是关于此案例的最受欢迎的问题。

这是我最终设法在互联网上找到的旧宝石: 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


优点:您不必更改原始程序以使其处理子目录。您可以选择仅在需要时处理子目录。这个命令非常简单易用。

Con:可能会失败一些命令(包含空格,引号,我不知道)。例如,请参阅this thread

答案 3 :(得分:2)

我知道这不是递归(通过枚举子目录进行迭代?),但它可能对某些应用程序更有效:

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

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

dir / ad - 仅列出目录

很酷的事情是 pushd 如果路径中有空格则不需要引号。

答案 4 :(得分:0)

Jack的解决方案最适合我,但我需要针对网络UNC路径(cifs / smb共享)执行此操作,因此需要进行一些修改:

for /R "\\mysrv\imgshr\somedir" %%f in (*.tif) do echo "%%f"

此方法的原始提示是here