2017-08-14 108 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