2017-08-14 8 views
0

私のバッチスクリプトはユーザ名のリストとユーザ名のリストを比較し、ユーザ名のリストがユーザ名のリストにある場合はnotepad.exeを開始します。それ以外は、no。私はGOTOを使ってこれをやっています。IFステートメントバッチSciptでGOTO

ユーザ名がリストにある場合は、match1に移動してメモ帳を起動します。それ以外の場合はmatch2と印刷してください。しかし、ユーザ名がリストにある場合でも、常にelse部分に行き、noを出力します。ここに私のコードは次のとおりです。 - 、しかし

@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を使用せずにこれをしたとき、それが働いていることに注意してくださいよくたとえば、一致するものがあれば、メモ帳を起動し、それ以外の場合はnoを入力します。 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が実行され、それ以外の場合は2番目の文字列が検索され、3番目の文字列が検索されます。一致しない場合、forにはオプションが不足しているので、次の命令(goto match2)を終了して実行します。

バッチは、gotocallまたはexitに達するまで、行を1つずつ実行するだけであることに注意してください。したがって、match1の命令が実行されると、flow throughが次の命令に実行されるため、match2も実行します。

2

あなたは(それがFORループに戻らない)、とすぐにGOTOはループが壊れている実行されるよう、そのようGOTOを使用することはできません。代わりに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

私は 'Echo no%1'を使用して、現在のユーザーに' ELSE CALL:MATCH2 %% a'を渡します。そうでなければ決して知ることはできません.... +1 – LotPings

+1

@LotPings、私はOPがis not '本当に 'notepad.exe'を開いても実際の目的を果たさないので、同様に失敗したマッチにも注意してください。そのような理由から、私はこれらのことを変える必要がないことを知った。 – Compo