批处理:如何在 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章

自学Linux Shell12.1-结构化命令if-then

oracle怎么写IF语句?

shell编程-语句

结构化命令

结构化命令

2 个要求:1)用 FORALL 替换多个 FOR 循环 2)在向表中插入数据时使用 IF-THEN-ELSE 条件