2016-11-22 6 views
0

入力パラが有効かどうかを判断し、有効な文字列( "aaa"、 "bbb"、 "ccc"、 "ddd" if-elseを使用します。私はこれを行う簡単な方法が欲しいです。私はこれを作る方法がわからないwindowsバッチファイルのループを文字列に入力する

set env=%1 
for %%A in ("aaa" "bbb" "ccc" "ddd") do if "%env%"==%%A echo true else goto end 

: は私のような何かをしたいと。

set env=%1 
if "%env%"neq"aaa" and "%env%"neq"bbb" and "%env%"neq"ccc"and "%env%"neq"ddd" (
    goto end 
) 

感謝aschipflとマグー:

は、私が欲しいのようなものです。

私の解像度があるとして:

for %%a in (aaa bbb ccc ddd) do (
    if "%env%"=="%%a" (
    goto next  
    ) 
) 
@echo Wrong parameter! 
goto end 
:next 
+2

[DOSバッチファイル内の文字列のリストに文字列が含まれているかどうかを調べる方法](http://stackoverflow.com/questions/11235153/how-to-find-if-a-string- dos-batch-file-in-stringのリストです) –

答えて

1

、私は句if/elseの基本的な問題を指摘したい:

if "%env%"==%%A echo true else goto end 

場合、パーサーは、したがって、単一のコマンドラインとして比較式の後部分全体を扱います比較が肯定的である場合、true else goto endがエコーされることになります。あなたはif文はこのように、括弧を置くことによって終了パーサを表示する必要があることを解決するには...:

if "%env%"=="%%~A" (echo true) else goto end 
...またはこれを、あなたは複数行、それに広がるしたい場合:

if "%env%"=="%%~A" (
    echo true 
) else (
    goto end 
) 

さらに、"aaa" bbb "ccc" dddのような文字列のリストを提供した場合でも、比較式の右部分が常に引用符内に配置されるように、を"%%~A"に置き換えました。


は、私の知る限り理解しますが、最初の引数%1は、与えられた文字列のいずれにも一致しない場合には:endに行きたいです。一致が見つかった場合でも(常に3つの不一致があるため)常に:endにジャンプするため、else句が確実に実行されます(ifを修正したとします)/else)。

次のようにあなたは(一致が検出されたことを示すFLAG変数を使用して)、コードを変更することができます:

また
set "FLAG=" 
for %%A in ("aaa" "bbb" "ccc" "ddd") do (
    if "%~1"=="%%~A" (
     set "FLAG=true" 
    ) 
) 
if not defined FLAG goto :end 
rem // Execution continues here in case a match has been found... 

、あなたはこれを(ループを残すために、別のgotoを使用して)行うことができます

for %%A in ("aaa" "bbb" "ccc" "ddd") do (
    if "%~1"=="%%~A" (
     goto :found 
    ) 
) 
goto :end 
:found 
rem // Execution continues here in case a match has been found... 

上記のコードスニペットでは、大文字と小文字を区別する文字列の比較を行います。それを変更するには、if /Iを使用してください。

1

あなたがやろうとしているが、比較が真である場合は、提示されたコードはtrue else goto endをエコーなるか全く分かりません。

if "%env%"==%%A (echo true) else (goto end) 

endに行くそうでない場合は、試合にtrueをエコーし​​ます。角括弧の配置は重要です。) else (は同じ物理行になければなりません。まず

関連する問題