web-dev-qa-db-ja.com

.batでユーザー入力を要求および受信し、それを使用して特定のプログラムを実行するにはどうすればよいですか?

これは私がこれまで持っているものです

@echo off
:Ask
echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If %INPUT%=="y" goto yes 
If %INPUT%=="n" goto no
If %INPUT%=="Y" goto yes
If %INPUT%=="N" goto no
:yes
Java -jar lib/RSBot-4030.jar -dev
echo Starting RSbot in developer mode
:no
Java -jar lib/RSBot-4030.jar
echo Starting RSbot in regular mode
pause

いずれにしても、ユーザーがyまたはnを入力すると、常に-devモードで実行されます。

答えが「はい」の場合は-devモードで実行し、答えが「いいえ」の場合は通常モードで実行する方法を教えてください。また、入力がY、N、y、またはnではない場合、どうすれば再び質問するのですか?

29

入力がたとえばNの場合、IF行は次のように評価されます。

If N=="y" goto yes 
If N=="n" goto no
…

つまり、N"y"と比較し、次に"n"などを"N"と比較しています。ユーザーが何らかの方法で"N"または"y"(つまり、4文字のいずれかであるが二重引用符で囲まれている)を入力することを決定しない限り、一致することはありません。

したがって、"ynY、およびNの周囲から削除するか、%INPUT%の周囲に配置する必要があります。条件文。後者をお勧めします。なぜなら、バッチスクリプトで特別な意味を持つ文字の少なくとも一部をエスケープするからです(ユーザーが文字を入力できた場合)。だから、これはあなたが得るべきものです:

If "%INPUT%"=="y" goto yes 
If "%INPUT%"=="n" goto no
If "%INPUT%"=="Y" goto yes
If "%INPUT%"=="N" goto no

ところで、次のように/IスイッチをIFステートメントに適用することで、条件の数を減らすことができます。

If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no

/Iスイッチを使用すると、比較で大文字と小文字が区別されないため、大文字と小文字が異なる文字列を個別にチェックする必要はありません。

もう1つの問題は、開発モードのコマンドが実行された後、他のコマンドにジャンプすることがないため、ユーザーが開発モードでJavaを実行することに同意した場合、開発モードと非開発モードの両方で実行されるため、スクリプトに次のようなものを追加する必要があるかもしれません。

...
:yes
Java -jar lib/RSBot-4030.jar -dev
echo Starting RSbot in developer mode
goto cont
:no
Java -jar lib/RSBot-4030.jar
echo Starting RSbot in regular mode
:cont
pause

最後に、誤った入力を処理する問題に対処するために、別の(無条件の)gotoコマンドを条件ステートメントの直後、yesラベルの直前、つまりgoto Askに追加できます。プロンプトが表示され、入力が要求されるスクリプトの先頭に戻るか、alsoジャンプの前に別のECHOコマンドを追加して説明することもできます入力が正しくなかったこと、このようなもの:

@echo off
:Ask
echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no
echo Incorrect input & goto Ask
:yes
...

注:ここで言及した問題のいくつかは、その回答で@xmjxによっても対処されており、完全に認めています。

39
Andriy M

私はただやる:

set /p input= yes or no
if %input%==yes echo you clicked yes
if %input%==no echo you clicked no
pause
6
poop

これが実際の例です:

@echo off
:ask
@echo echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no
goto ask
:yes
@echo you select yes
goto exit
:no
@echo you select no
goto exit
:exit
@pause
2
elron smith

[はい]または[いいえ]プロンプトでバッチファイルを改善しました。ユーザーがyとn以外の文字を入力すると、再び有効な入力をユーザーに要求します。わたしにはできる。

    @echo off

    :ConfirmBox 
        set /P c= Are you sure want to contine (y/n)?

    if /I "%c%" EQU "Y" (
    goto :FnYes 
    ) else if /I "%c%" EQU "N" ( 
    goto :FnNo
    ) else ( 
    goto :InValid 
    )


:FnYes
     echo You have entered Y
     goto :END

:FnNo
     echo You have entered N
     goto :END

:InValid
     echo Invalid selection. Enter Y or N
     goto :ConfirmBox

:END
    pause
    exit  

/ I in条件は、小文字と大文字の両方を検証します。

1

これを実行しているプラ​​ットフォームはわかりませんが、.bat拡張子が原因でWindowsを想定しています。

また、これをチェックする方法はありませんが、これはバッチプロセッサがエラーのためにIf行をスキップし、-devを使用して行を実行するようです。

コードとともに2つのジャンプターゲット(:yesおよび:no)を変更することで、これを試すことができます。その場合、-devなしの行が実行されると、If行に誤りがあることがわかります。

その場合は、==.batファイルで比較を行う正しい方法であるかどうかを確認してください。

また、bashがこのようなことを行う方法から判断すると、%foo=="y"は、%fooに引用符が含まれている場合にのみtrueと評価される場合があります。したがって、おそらく"%foo"=="y"が道です。

0
xmjx
echo off
setlocal
SET AREYOUSURE = N
:Prompt
set /P AREYOUSURE=Update Release Files (Y/N)?
if /I %AREYOUSURE% NEQ Y GOTO END
set /P AREYOUSURE=Are You Sure you want to Update Release Files (Y/N)?
if /I %AREYOUSURE% NEQ Y GOTO END

echo Copying New Files

:END

これは私が定期的に使用するコードです。このブログの例で、引用が使用されていることに気付きました。テスト行が引用符を使用するように変更された場合、テストは無効です。

if /I %AREYOUSURE% NEQ "Y" GOTO END

XP、Vista、Win7、Win8でテストしました。引用符を使用すると、すべて失敗します。

0
johnggold

Windowsのバージョンによっては、「選択」オプションを使用すると役立つ場合があります。私の知る限り、すべてではないにしても、ほとんどのx64バージョンではサポートされていません。使用例とともにChoice.vbsと呼ばれる便利な置換は、Choice.Zipという名前でSourceForgeにあります。

0
questorfla