让我们首先通过示例文件夹结构和C:\SearchFolder 的每个子文件夹中名称为file.name 的文件来阐明任务:
C:\SearchFolder
├───FolderA
│ │ file.name
│ │
│ ├───FolderA
│ │ │ file.name
│ │ │
│ │ ├───FolderA
│ │ │ │ file.name
│ │ │ │
│ │ │ ├───FolderA
│ │ │ │ file.name
│ │ │ │
│ │ │ └───FolderB
│ │ │ file.name
│ │ │
│ │ └───FolderB
│ │ │ file.name
│ │ │
│ │ ├───FolderA
│ │ │ file.name
│ │ │
│ │ └───FolderB
│ │ file.name
│ │
│ └───FolderB
│ │ file.name
│ │
│ ├───FolderA
│ │ │ file.name
│ │ │
│ │ ├───FolderA
│ │ │ file.name
│ │ │
│ │ └───FolderB
│ │ file.name
│ │
│ └───FolderB
│ │ file.name
│ │
│ ├───FolderA
│ │ file.name
│ │
│ └───FolderB
│ file.name
│
└───FolderB
│ file.name
│
├───FolderA
│ │ file.name
│ │
│ ├───FolderA
│ │ │ file.name
│ │ │
│ │ ├───FolderA
│ │ │ file.name
│ │ │
│ │ └───FolderB
│ │ file.name
│ │
│ └───FolderB
│ │ file.name
│ │
│ ├───FolderA
│ │ file.name
│ │
│ └───FolderB
│ file.name
│
└───FolderB
│ file.name
│
├───FolderA
│ │ file.name
│ │
│ ├───FolderA
│ │ file.name
│ │
│ └───FolderB
│ file.name
│
└───FolderB
│ file.name
│
├───FolderA
│ file.name
│
└───FolderB
file.name
可以使用以下方法创建包含文件的文件夹结构:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BaseFolder=C:\SearchFolder"
for %%G in (A B) do (
for %%H in (A B) do (
for %%I in (A B) do (
for %%J in (A B) do (
md "%BaseFolder%\Folder%%G\Folder%%H\Folder%%I\Folder%%J"
echo "%BaseFolder%\Folder%%G\Folder%%H\Folder%%I\Folder%%J">"%BaseFolder%\Folder%%G\Folder%%H\Folder%%I\Folder%%J\file.name"
)
echo "%BaseFolder%\Folder%%G\Folder%%H\Folder%%I">"%BaseFolder%\Folder%%G\Folder%%H\Folder%%I\file.name"
)
echo "%BaseFolder%\Folder%%G\Folder%%H">"%BaseFolder%\Folder%%G\Folder%%H\file.name"
)
echo "%BaseFolder%\Folder%%G">"%BaseFolder%\Folder%%G\file.name"
)
endlocal
示例结构是在 Windows 命令提示符窗口中运行 tree /F C:\SearchFolder 时输出的。
应该只在C:\SearchFolder 的前三个子文件夹级别中搜索名称为file.name 的文件,并且找到的具有该名称的文件的路径必须以FolderA\FolderB\ 结尾。
这可以使用以下批处理文件来完成:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BaseFolder=C:\SearchFolder"
set "FolderName1=FolderA"
set "FolderName2=FolderB"
set "FileName=file.name"
for /F "delims=" %%I in ('dir "%BaseFolder%" /AD /B 2^>nul') do (
for /F "delims=" %%J in ('dir "%BaseFolder%\%%I\%FolderName1%\%FolderName2%\%FileName%" /A-D /B 2^>nul') do echo "%BaseFolder%\%%G\%FolderName1%\%FolderName2%\%FileName%"
)
for /F "delims=" %%J in ('dir "%BaseFolder%\%FolderName1%\%FolderName2%\%FileName%" /A-D /B 2^>nul') do echo "%BaseFolder%\%FolderName1%\%FolderName2%\%FileName%"
endlocal
输出是:
"C:\SearchFolder\FolderA\FolderA\FolderB\file.name"
"C:\SearchFolder\FolderB\FolderA\FolderB\file.name"
"C:\SearchFolder\FolderA\FolderB\file.name"
因此,只需三个 FOR 命令即可在 C:\SearchFolder 的三个子文件夹中搜索文件 file.name,这些子文件夹存储在名称为 FolderB 的文件夹中姓名FolderA。
要了解所使用的命令及其工作原理,请打开command prompt 窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
dir /?
echo /?
endlocal /?
for /?
md /?
set /?
setlocal /?
tree /?
阅读有关Using command redirection operators 的Microsoft 文档,了解> 和2>nul。重定向运算符 > 必须在 FOR 命令行上使用插入字符 ^ 转义,以便在 Windows 命令解释器在执行命令 FOR 之前处理此命令行时被解释为文字字符> 在后台启动的单独命令进程中执行嵌入的dir 命令行,%ComSpec% /c 和' 中的命令行作为附加参数附加。
PS:rd /Q /S C:\SearchFolder 删除整个示例文件夹结构。