IF语句批量Scipt中的GOTO

时间:2017-08-14 06:20:45

标签: batch-file if-statement goto

我的批处理脚本将用户名与用户名列表进行比较,如果用户名变量位于用户名列表中,则启动notepad.exe。否则,打印否。我是用GOTO做的。

因此,如果用户名在列表中,请转到match1并启动记事本。否则,转到match2并打印否。但即使用户名在列表中,它似乎总是转到else部分并打印否。这是我的代码: -

@ECHO OFF

set user=username1
set list=username3 username2 username1 

(FOR %%a IN (%list%) DO (if %user%==%%a (GOTO MATCH1 
) else ( GOTO MATCH2 
)                   
))

:MATCH1
notepad.exe

:MATCH2
echo no 

pause  

然而,当我以这种方式制作列表时,它会启动记事本并打印否: -

 set list=username1 username2 username3

请注意,当我在不使用GOTO的情况下这样做时,效果很好。例如,如果匹配,则启动记事本,否则,打印否。我是以错误的方式使用GOTO吗?还是我误解了GOTO的功能?

2 个答案:

答案 0 :(得分:2)

你不能这样使用GOTO,只要GOTO运行,循环已经中断,(它不会返回FOR循环) 。您可以改为使用CALL

@ECHO OFF
SET "user=username1"
SET "list=username3 username2 username1"

FOR %%A IN (%list%) DO IF /I "%user%"=="%%a" (CALL :MATCH1) ELSE CALL :MATCH2
PAUSE
EXIT/B

:MATCH1
notepad.exe
GOTO :EOF

:MATCH2
ECHO no
GOTO :EOF

答案 1 :(得分:0)

@ECHO OFF

set user=username1
set list=username3 username2 username1 

FOR %%a IN (%list%) DO if %user%==%%a GOTO MATCH1 
GOTO MATCH2 

:MATCH1
notepad.exe

:MATCH2
echo no 

你误解了for%%a 依次获取每个列表值,然后执行匹配。

匹配将为true或者为false。别无选择。您的代码检查第一个字符串的匹配项。在比赛中,转到match1。否则,转到match2。这意味着您离开循环,因此for仅使用第一个值。

使用修改后的代码,如果第一个字符串匹配,则执行goto,否则它将查看第二个字符串,否则将执行第三个字符串。如果不匹配,则for已用完选项,因此终止并执行以下指令,即goto match2

请注意,批处理只是逐个执行行,直到达到goto callexit。因此,一旦match1中的指令执行,执行将flow through执行以下指令,因此也执行match2