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