Batch file 在批处理文件中中断嵌套for循环

Batch file 在批处理文件中中断嵌套for循环,batch-file,Batch File,在两次遇到这个问题后,我想我会把它贴在这里,看看是否有人知道如何绕过它 我似乎无法使用goto打破嵌套循环,因为它看起来像是当它打破内部循环时,括号就不匹配了,因为它从未到达内部闭合循环 我已经把它缩小到一个非常简单的例子 for %%a in (1,2,3) do ( for %%b in (4,5,6) do ( echo Breaking goto :BREAK ) :BREAK ) 这将导致错误 ) was unexpected at this time. 我想也许添加额外的括号可以

在两次遇到这个问题后,我想我会把它贴在这里,看看是否有人知道如何绕过它

我似乎无法使用
goto
打破嵌套循环,因为它看起来像是当它打破内部循环时,括号就不匹配了,因为它从未到达内部闭合循环

我已经把它缩小到一个非常简单的例子

for %%a in (1,2,3) do (
for %%b in (4,5,6) do (
echo Breaking
goto :BREAK
)
:BREAK
)
这将导致错误

) was unexpected at this time.
我想也许添加额外的括号可以解决这个问题,但除非我知道我要打破,否则它不会有帮助。如果是有条件的打破,这是同样的问题


除了使用
if
else
的有条件中断外,是否有其他方法可以轻松地将内部循环中断回外部循环?

您能否提供有关您的需求的更多信息? 同时,如果它符合您的要求,您可以尝试一下。 如果您需要更多信息,请随时通知我

@echo off
for %%a in (1,2,3) do ( 
for %%b in (4,5,6) do (
echo Breaking
goto Break 
)
)
:Break

通过在标签中放置内循环进行打断

for %%a in (1, 2, 3) DO (

   call :innerloop 
)
:innerloop
for %%b in (4, 5, 6) DO (
  if %%b==<something> (
    echo    break
    goto :break
  )

)
:break
(1,2,3)DO中%%a的
(
调用:innerloop
)
:内部循环
对于(4,5,6)中的%%b,请执行以下操作(
如果%%b==(
回音中断
后藤:休息
)
)
:休息

您还可以在中断后使用绑定到FOR的控制变量忽略其余迭代:

@echo off
for %%a in (1,2,3) do (
   echo Top-level loop: %%a
   set break=
   for %%b in (4,5,6) do if not defined break (
      echo Nested loop: %%a-%%b
      if %%b == 4 (
         echo Breaking
         set break=yes
      )
   )
)
此方法将嵌套for主体的代码保留在其原始位置,并允许在for主体内的多个点轻松设置打断


安东尼奥

安东尼奥的建议很好。我在我的示例中使用它来解析文件列表中的一些CSV或HTML文件。(为循环嵌套)。第一个查找解析文件列表,第二个查找解析每个文件的内容。分离器为:;或/

@dir /O /B j:\temp\*.txt > j:\temp\filelist.doc
@for /F "tokens=1" %%a in (j:\temp\filelist.doc) DO (
 @echo j:\temp\%%a
 @set ef=
 @for /F "delims=;/ tokens=1,2,3,4,5,6,7*" %%b in (j:\temp\%%a) DO @if not defined ef (
  @if %%e == CNAME (
   @echo Do something here
   @set ef=yes
  )
 )
)

定义的
可以对多个目标实施邪恶行为。我不建议使用它,除非您确切地知道它是如何工作的以及所有潜在的用例

避免使用任何分隔符(空格、, 变量名称中的逗号等),例如,如果定义了变量 如果变量名包含分隔符,则通常会失败

不使用
退出
转到
的更安全答案:

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

Set time_to_exit=false

FOR /L %%O IN (1,1,3) DO (
    echo [  Outer  ] loop iteration %%O
    FOR /L %%I IN (1,1,3) DO (
        IF NOT "!time_to_exit!"=="true" (
            echo ]Inner[ loop iteration %%I
            IF "%%O"=="2" Set time_to_exit=true
        )
    )
)
输出:

[  Outer  ] loop iteration 1
]Inner[ loop iteration 1
]Inner[ loop iteration 2
]Inner[ loop iteration 3
[  Outer  ] loop iteration 2
]Inner[ loop iteration 1
[  Outer  ] loop iteration 3

这将打破两个循环,我只想打破内部循环:)也许你可以把内部循环放在一个标签中,然后从外部循环+1调用这个标签,我真的很喜欢这个,因为它保持了嵌套的位置。不是很好,嵌套需要大量循环计数。提醒:如果您需要为bash重新编写脚本,那么使用
GOTO
是不可移植的。如果您严重依赖
GOTO
,这将是一场重新分解的噩梦。与其在所有行上抑制echo,不如使用header@echo off