2017-08-14 149 views
0

我的批处理脚本将用户名与用户名列表进行比较,如果用户名变量位于用户名列表中,则开始notepad.exe。否则,打印号码。我正在使用GOTO来做这件事。IF语句中的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

尝试在循环中添加一个'ECHO %% a'来查看它实际检查的内容。 –

回答

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轮流获取每个列表值,并执行匹配。

两者之间的匹配都是真的,否则将是错误的。没有其他选择。你的代码检查第一个字符串的匹配。在比赛中,转到match1。否则,转到match2。这意味着你离开循环,所以for只使用第一个值。

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

请注意,批次只是逐一执行行,直到达到gotocallexit。因此,一旦match1中的指令被执行,执行将会执行flow through到下面的指令,所以执行match2也是如此。

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 
+0

我会使用'回声%1'并传递当前用户'ELSE CALL:MATCH2 %% a',否则你永远不会知道.... +1 – LotPings

+1

@LotPings,我假设OP不是' t真的打开'notepad.exe'因为这不符合实际的目的,同样在失败的比赛。出于这个原因,我看到没有必要改变这些东西,因为这样做可能不会影响'真正'的命令。 – Compo