Loops 从内环批处理中断

Loops 从内环批处理中断,loops,batch-file,break,Loops,Batch File,Break,我有3个嵌套循环,当在目录中找到具有特定模式的文件时,我想从第三个循环中断。我在每个创建的文件后都使用“break”标签,但问题是该方法从所有3个循环中退出。在此处输入代码 FOR /F "delims= " %%A in (file.txt) do ( set pattern=%%A set file="" FOR /f "tokens=*" %%t in ( 'dir /a:d /b !DIR!' ) do ( FOR /f "tokens=*" %%f in (

我有3个嵌套循环,当在目录中找到具有特定模式的文件时,我想从第三个循环中断。我在每个创建的文件后都使用“break”标签,但问题是该方法从所有3个循环中退出。
在此处输入代码

FOR /F "delims= " %%A in (file.txt) do (
  set pattern=%%A
  set file=""
  FOR /f "tokens=*" %%t in (
 'dir /a:d /b !DIR!'
  ) do (
    FOR /f "tokens=*" %%f in (
    'dir /a:d /b "!DIR!\%%t"'
    ) do (
    FOR /f "tokens=*" %%g in (
    'dir /b !DIR!\%%t\%%f ^| findstr /i /c:"!pattern!.inst"'
    ) do (
      set file=%%g
      echo "file: !file!"
      goto :break // BREAK
     )
    )
  ) 
  : break
  IF not [!file!] == [""] (
    echo "found !file!"
  )
)

你不能。for循环结构中的任何
goto
都将取消循环

如果只需要第一个元素,可以在内部循环中进行测试

if not defined file set "file==%%g"
或者,您可以过滤
dir
命令的输出,只将第一行输入
for
命令

for /f "delims=" %%a in (file.txt) do (
    set "file="
    for /d %%t in ("!dir!\*"
    ) do for /d %%f in ("%%~ft\*"
    ) do for /f "tokens=1,* delims=:" %%d in (
        'dir /b "%%~ff\*.inst*" ^| findstr /n /i /c:"%%a.inst" ^| findstr /b /c:"1:" '
    ) do set "file=%%e"

    if defined file echo found !file!
)

无论如何,不知道代码的目的,这只是一个意见,但是首先检索文件夹/文件的列表要考虑到一个临时文件,然后迭代它,检查检索的信息与“模式”,将更有效率,不必为每个模式迭代完整的文件夹结构。

这花费了太多时间,因为我有一个很长的文件列表,我想在找到第一个文件后退出。谢谢你的回答。我还找到了另一个解决方案,制作一个包含内部循环的子例程,并从第三个循环调用它。@georgiana_e,这就是首先检索列表然后处理它的方法的原因。您将只在文件系统上迭代一次。下一次迭代将处理已经在文件缓存中的文件中的信息。而且,将第三个循环移动到子例程并不能避免这样一个事实:for/f循环需要首先检索所有数据。也就是说,
dir | findstr
管道在
for
内的代码开始执行之前已经处理了所有数据。