批处理:如何在 for 命令中返回 if then 语句?
Posted
技术标签:
【中文标题】批处理:如何在 for 命令中返回 if then 语句?【英文标题】:Batch: How to do returning if then statements in for command? 【发布时间】:2022-01-03 04:09:31 【问题描述】:我正在尝试找出一种在 for 命令中返回 if then 语句的方法,这是目前的代码:
我们有一个名为:File.cfg 的文件,其中包含多个数字(不超过 6 个数字):
1
3
4
6
2
5
将这些数字设置为变量:
setlocal enabledelayed expansion
setlocal
set /a count=1
for /F "usebackq delims=" %%a in ( File.cfg ) do (
set line!count!=%%a
set /a count+=1
)
然后尝试执行返回 if then 操作:
set /a count=0
echo 1 > list.txt
:Loop
set /a count+=1
echo %count% > list.txt
FOR /F "usebackq delims= " %%a in (list.txt) do (
echo !line%%a!
if %%a==7 goto :eof
if !line%%a!==1 goto 1
if !line%%a!==2 goto 2
if !line%%a!==3 goto 3
if !line%%a!==4 goto 4
if !line%%a!==5 goto 5
if !line%%a!==6 goto 6
)
goto #的示例
:1
code
code
code
goto loop
虽然最终批处理程序过早结束,主要是在计数 1 处。
最终输出结果:
( echo !line1!
if 1 == 7 goto :eof
if !line1! == 1 goto 1
if !line1! == 2 goto 2
if !line1! == 3 goto 3
if !line1! == 4 goto 4
if !line1! == 5 goto 5
if !line1! == 6 goto 6
)
1
【问题讨论】:
我们是否应该假设您启用了延迟扩展。您在问题中提供的所有代码都应该是minimal reproducible example,以便其他人可以复制它。 而不是goto
(设计上没有“返回”),使用call
。见call /?
@Squashman 是的,忘了说。
每个goto
都会打破循环。这意味着,第一个 goto
被执行,然后就没有循环了。如果您 goto
up (在循环之前),则循环再次开始 - 通过再次从头开始读取文件。如果要处理的不仅仅是文件的第一行,则不能使用goto
。 (看,@Squashman 在他的回答中做了什么)
【参考方案1】:
除非您尝试对某事进行概念验证,否则不确定您为什么拥有复杂的代码。以我的经验,实现您想要的结果的最简单方法就是这样做。
@echo off
for /F "usebackq delims=" %%a in ("File.cfg") do CALL :%%a
REM END OF MAIN Functions below
GOTO :EOF
:1
ECHO IN 1
GOTO :EOF
:2
ECHO IN 2
GOTO :EOF
REM Shortened for brevity
上面的代码会输出
IN 1
IN 3
IN 4
IN 6
IN 2
IN 5
如果你真的想使用数组变量,那么最简单的解决方案就是下面的代码。
@echo off
setlocal enabledelayedexpansion
set "count=0"
for /F "usebackq delims=" %%a in ("File.cfg") do (
set /a "count+=1"
set "line!count!=%%a"
)
FOR /L %%G IN (1,1,%count%) DO CALL :!line%%G!
REM END OF MAIN Functions below
GOTO :EOF
:1
ECHO IN 1
GOTO :EOF
:2
ECHO IN 2
GOTO :EOF
REM Shortened for brevity
上述代码也会输出
IN 1
IN 3
IN 4
IN 6
IN 2
IN 5
【讨论】:
这行得通,谢谢你也简化了它。以上是关于批处理:如何在 for 命令中返回 if then 语句?的主要内容,如果未能解决你的问题,请参考以下文章