Windows批处理文件在目录中循环以处理文件?

Windows批处理文件在目录中循环以处理文件?,windows,recursion,batch-file,Windows,Recursion,Batch File,好的,我是一名PHP程序员,不幸的是,出于简短的原因,我不想宣布,我需要编写/使用一个批处理文件来为我处理一些图像 我有一个满是嵌套文件夹的文件夹,在每个嵌套文件夹中还有一个文件夹,其中包含许多TIF图像,每个文件夹中的图像数量各不相同。我还有一个批处理文件,我们将其命名为ProcessImages.bat for Windows,您可以“删除”这些TIF文件(或者在调用bat时在命令行列表中指定它们);在此基础上,它创建了一个新文件夹,其中包含基于我拥有的EXE的所有图像处理 好的是,因为ba

好的,我是一名PHP程序员,不幸的是,出于简短的原因,我不想宣布,我需要编写/使用一个批处理文件来为我处理一些图像

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

好的是,因为bat文件使用了您“放置”到它上面的文件夹的路径,所以我可以选择一个文件夹的所有TIF并将其放置以进行处理。。。但当我继续手动处理TIFs的300多个文件夹时,我发现它让我的系统陷入了难以置信的困境,如果我一次只能处理一个(而不是手动),那就太好了

所有这些都表明。。。有没有人能给我指出正确的方向(对于一个Windows bat文件业余爱好者来说),让我写一个Windows bat脚本,我可以从一个目录中调用它,并让它遍历该目录中包含的所有目录。。。并对每组图像一次运行一个处理批处理文件

提前谢谢


Tyler

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

@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

Aacini的解决方案可行,但您只需一行即可:

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

在这里发布,因为这似乎是关于这个案件最流行的问题

我终于在互联网上找到了一块古老的宝石:
它在当前目录和所有子目录中执行提供的命令,就这么简单


让我们假设您有一些程序可以处理目录中的所有文件(但用例实际上比这要广泛得多):

因此,您希望在当前目录和所有子目录中运行此程序:

:: 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:某些命令(包含空格、引号,我不知道)可能会失败。例如,请参阅。

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

for /F "delims=" %%i in ('dir /ad /on /b /s') do (
    pushd %%i
    dir | find /i "Directory of"
    popd
)
用您可能需要的任何命令替换第三行

dir/ad-仅列出目录


很酷的一点是,如果路径中有空格,pushd不需要引号。

Jack的解决方案最适合我,但我需要为网络UNC路径(cifs/smb共享)使用它,因此需要稍微修改:

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

这种方法的原始提示是

@Aacini。您还可以解释/评论这些/D、%%f命令的作用吗?那太好了!您可以从以下url中找到有关语法的更多信息。真的很好,你救了我一天。将绝对路径+文件的%CD%%%f用作程序的参数。我认为可以省略“call:treeProcess”和“goto:eof”这两行。@RobertPollak:你说得对<代码>:)在这种情况下,最后一个退出/B也可能会被忽略…不知道多少年后,但我仍然在使用这个!我正在使用它,出于某种原因,它对目录树中的每个文件都执行命令,而不仅仅是那些具有我指定的扩展名的文件。正如我所说,我的方法可以精确地控制您在每个子目录中执行的操作。如果该过程需要特定的顺序(例如,先移动文件,然后删除空的子目录),则无法使用
for/R
…如果需要在每个子目录设置“当前目录”,则此操作不起作用。Aacini适用于一个目录,这适用于从起点开始的所有目录。这就是我要找的!谢谢对于我需要尽快完成的快速脏工作来说,这是一个非常好的解决方案。我不能在
/R
之后使用一个变量吗?我正在将(拖放)文件/文件夹传递到批处理文件,并且有一个主循环(
FOR%%I IN(%%*)DO
),用于检查参数是dir还是file。如果参数是dir,则有第二个循环,该循环需要递归。我无法使用主循环中的变量使其工作:
FOR/R%%I%%f IN(*)DO
。我尝试了不同的组合,但是
/R%%I
就是不起作用。
for /R "\\mysrv\imgshr\somedir" %%f in (*.tif) do echo "%%f"