Loops 从内环批处理中断
我有3个嵌套循环,当在目录中找到具有特定模式的文件时,我想从第三个循环中断。我在每个创建的文件后都使用“break”标签,但问题是该方法从所有3个循环中退出。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 (
在此处输入代码
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
内的代码开始执行之前已经处理了所有数据。