我的批处理脚本将用户名与用户名列表进行比较,如果用户名变量位于用户名列表中,则启动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的功能?
答案 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
call
或exit
。因此,一旦match1
中的指令执行,执行将flow through
执行以下指令,因此也执行match2
。