好的,我是一名PHP程序员,不幸的是,由于我不会为了简洁而宣布的原因,我需要编写/使用批处理文件为我处理一些图像。
我有一个装满嵌套文件夹的文件夹,每个嵌套文件夹中都有一个包含多个TIF图像的文件夹,每个文件夹中的图像数量各不相同。我也有一个批处理文件,让我们称它为ProcessImages.bat for Windows,你可以“删除”这些TIF文件(或者显然在调用bat时在命令行列表中指定它们);在此基础上创建一个新文件夹,我的所有图像都基于我拥有的EXE进行处理。
好处是,因为bat文件使用你“删除”的文件夹中的路径,我可以选择一个文件夹的所有TIF并将其删除以进行处理...但是我继续手动为300个左右的TIF文件夹执行此操作我发现它让我的系统陷入困境如此令人难以置信,如果我一次只能处理这些文件(无需手动操作),那就太棒了。
所有这些......可能有人指出我正确的方向(对于Windows bat文件AMATEUR),我可以编写一个Windows bat脚本,我可以从目录中调用并让它遍历所有该目录中包含的目录...并在每组图像上一次运行我的处理批处理文件?
提前致谢!
泰勒
答案 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