Windowsバッチファイルで「よろしいですか」というプロンプトを表示するにはどうすればよいですか?


94

ある場所から別の場所に大量のファイルをコピーし、それを元に戻すバッチファイルがあります。コマンドバッファから誤ってそのコマンドを誤って選択し続け、コミットされていない変更を大量に上書きするのを助けるだけです。

.batファイルに「よろしいですか」と表示させ、残りのファイルを実行する前に「y」と入力させるには、どのコードが必要ですか?「y」以外を入力すると、その行で実行を終了します。

11月27日を編集 Okまだわからないので、これに未回答のマークを付けました。「exit」と呼ぶと それは私が欲しいものではないcmd.exeを閉じます。これはすべて、Windowsが間違ったコマンドバッファを実装したためです(少なくとも、私が慣れているものとは異なります)。

回答:


168

あなたは次のようなものが必要です:

@echo off
setlocal
:PROMPT
SET /P AREYOUSURE=Are you sure (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END

echo ... rest of file ...


:END
endlocal

5
追加するのは、SET AREYOUSURE=Nコマンドウィンドウで既にスクリプトを実行している場合に選択をクリアするために、プロンプトの前に追加することだけです。これがない場合、デフォルトは以前に選択された選択のままになります。
isapir 2014

4
@Igalとがそれsetlocalを処理するendlocalはずだと確信しています。%AREYOUSURE%後は存在しなくなりendlocalます。

1
@dudeprgmあなたはおそらく正しいです。私はコードでそれらを逃したと思います。
isapir 2015年

2
... 重要な2行に関するいくつかの説明的な単語を使用すると、より価値があります。
ウルフ

@Joe多分彼(私のように)彼が(まだ)それらを理解していないのでできないでしょう。ですから、答えを拡大したり、それを説明するリソースへのリンクを
Marcus Mangelsdorf


15

choiceコマンドは、どこでも利用できません。新しいWindowsバージョンでは、setコマンド/pにユーザー入力を取得できるオプションがあります

SET /P variable=[promptString]

詳細についてはset /?、参照してください


...受け入れられたものよりもはるかに洞察力がありますが、私たちは明らかに緊急時に生きています。
ウルフ

8

Windowsコマンドラインのユーザープロンプトで使用できるコマンドは2つあります。

  • /Pコマンド拡張が有効になっているすべてのWindows NTバージョンで使用可能なオプションで設定
  • Windows Vista以降のWindowsバージョンのPCユーザー、およびWindows Server 2003以降のサーバーバージョンのWindowsでは、デフォルトでchoice.exeを使用できます。

setは、Windowsコマンドプロセッサの内部コマンドですcmd.exe/Pユーザーに文字列を要求するオプションは、デフォルトで有効になっているコマンド拡張機能を有効にした場合にのみ使用できます。

choice.exeは、にある独立したコンソールアプリケーション(外部​​コマンド)です%SystemRoot%\System32choice.exeのWindows Server 2003は%SystemRoot%\System32、Windows XPではデフォルトで使用できないが、Windows Server 2003ではデフォルトで使用できる他の多くのコマンドと同様に、Windows XPで使用するためにWindows XPマシンのディレクトリにコピーできます。

次の理由により、SET / Pの使用よりもCHOICEの使用を優先することをお勧めします。

  1. CHOICEは、オプション(および)の後に指定されたキー(それぞれSTDINから読み取られた文字)のみを受け入れ、ユーザーが間違ったキーを押した場合はエラービープを出力します。/CCtrl+C
  2. 選択では、許容できるキー以外のキーを押す必要はありません。SET / Pでユーザーがまたはで入力を終了する必要があるときに、受け入れ可能なキーが押されると、CHOICEは即座に終了します。RETURNENTER
  3. それはで可能ですCHOICE自動的にユーザーを待たずに、数秒後にデフォルトのオプションを続行するには、デフォルトのオプションとタイムアウトを定義します。
  4. 出力は以下のようなプロンプトを使って何かでバッチファイルを呼び出します別のバッチファイルから自動的にプロンプトに答えるに優れているecho Y | call PromptExample.bat使用上のCHOICEを
  5. ユーザーの選択の評価はとはるかに簡単ですCHOICEためのCHOICEのに割り当てられている押されたキー(文字)に応じた値で終了ERRORLEVEL簡単に次に評価することができます。
  6. SET / Pで使用される環境変数は、ユーザーがキーを押すRETURNENTER、ユーザーにプロンプ​​トを表示する前に定義されていなかった場合は定義されません。SET / Pコマンドラインで使用される環境変数は、以前に定義されていれば現在の値を保持し、ユーザーがRETURNまたはを押すだけENTERです。
  7. ユーザーは、SET / Pでプロンプトが表示され、後でcmd構文エラーのためにバッチファイルの実行を終了するか、バッチファイルにまったく含まれていないコマンドを実行する文字列を含めて、何でも入力できます。良いコード化されたバッチファイル。SET / Pを誤って、または意図的に間違ったユーザー入力から保護するために、いくつかの努力が必要です。

以下は、推奨されるCHOICEを使用したプロンプトの例です。また、Windowsを実行している使用中のコンピューターでは使用できないSET / Pchoice.exe使用しています。

@echo off
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice

setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=N"
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & goto :EOF
if /I not "!UserChoice!" == "Y" goto UseSetPrompt
endlocal
goto Continue

:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]? "
if errorlevel 2 goto :EOF

:Continue
echo So your are sure. Okay, let's go ...

注:このバッチファイルの用途は、使用して、Windows 95/98 / ME上で利用できない拡張コマンドcommand.comの代わりに、cmd.exeコマンドインタプリタとしての。

コマンドラインset "UserChoice=!UserChoice: =!"が追加されecho Y | call PromptExample.bat、Windows NT4 / 2000 / XPでこのバッチファイルを呼び出すことが可能になり、の使用を必要としませんecho Y| call PromptExample.bat。2つの文字列比較を実行する前に、STDINから読み取った文字列からすべてのスペースを削除します。

echo Y | call PromptExample.batで結果Yは、SPACE環境変数に割り当てられたばかりUserChoice。以下のため、それはプロンプト二回の処理につながる"Y "どちらも大文字と小文字を区別しない等しい"N""Y"最初のすべてのスペースを削除せずに。したがってUserChoice、値としてYSPACEN指定すると、2番目のプロンプトの実行時に、バッチファイルでデフォルトとして定義されたオプションを使用してもう一度プロンプトが実行され、次にバッチファイル処理が予期せず終了します。はい、SET / Pを安全に使用するのは非常に難しいですよね。

オプションのリストからユーザーに選択を求めるためのSET / PおよびCHOICEの使用法の詳細については、Windowsコマンドインタープリターが誤ったユーザー入力でバッチファイルの実行を終了しないようにする方法に関する回答を参照してください

さらにいくつかのヒント:

  1. IFは、比較演算子の左右の2つの文字列、二重引用符を含めて比較します。比較大文字と小文字を区別しないがそうすることの価値はないUserChoiceNしてY、しかし、の値UserChoiceに囲ま"持つ"N""Y"
  2. IF比較演算子EQUNEQ2つの文字列を比較するために2147483647としないように範囲-2147483648で2つの整数を比較するための主要な設計されています。EQUそして、NEQ文字列の比較のためにも仕事が、整数に左の文字列を変換するために役に立たない試みに二重引用符内の文字列を比較することになります。EQUまたNEQ、有効なコマンド拡張でのみ使用できます。文字列の比較のための比較演算子がある==not ... ==さえとしても、無効なコマンド拡張機能とその仕事command.comMS-DOSとWindowsの95/98 / MEはすでに、それらをサポート。詳細についてのIF比較演算子を見、WindowsのバッチファイルでなどNEQ、LSS、GTRにシンボルに相当します
  3. コマンドは、goto :EOF本当に終了バッチファイルの処理にコマンド拡張機能を有効にする必要があります。詳細については、GOTO:EOFの戻り先を参照してください

使用するコマンドとその機能を理解するには、コマンドプロンプトウィンドウを開き、そこで次のコマンドを実行し、各コマンドについて表示されるすべてのヘルプページをよく読みます。

  • choice /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

以下も参照してください。


1
これは信じられないほどの答えです。これからは、Choice.exeのみを使用します。
Bas

choice.exeはDOSでも6.0以降で使用されていました
Brian Minton

@BrianMintonそうではありません。CHOICE.COMMS-DOS 6.0、MS-DOS 7.0、Windows 95およびWindows 98では、デフォルトで16ビットアプリケーションが利用可能でした。ただしchoice.exe、Windows NT4、Windows 2000およびWindows XPでは、デフォルトでインストールされていませんでした。CHOICE.COMNT4、Windows 2000、Windows XPでも使用できますがchoice.exe、適切なリソースキットの32ビットを使用することをお勧めします。CHOICEに関するRob van der Woudeのページを参照してください。オプションはとの間CHOICE.COMで一部異なりますchoice.exe。ただし、問題はDOSに関するものではありません。
Mofi

5

ここで少し簡単です:

@echo off
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ...
if not %var%== Y exit

または

@echo off
echo Are You Sure?[Y/N]
choice /c YN
if %errorlevel%==1 goto yes
if %errorlevel%==2 goto no
:yes
echo yes
goto :EOF
:no
echo no

Yの後に、実行するコマンドを置きます。それが...の
ボブ・スミス

私は意味:%errorlevel%常に整数値です。例を含むドキュメントについては、こちらをご覧ください。
ステファン

1

はい/いいえの答えを得るための私の頼りになる方法は次とおりです。

また、大文字と小文字は区別されません。

これは、入力によって与えられたエラーをチェックし、choice変数を必要なものに設定するだけなので、以下のコードで使用できます。

@echo off
choice /M "[Opt 1]  Do you want to continue [Yes/No]"
if errorlevel 255 (
  echo Error
  ) else if errorlevel 2 (
  set "YourChoice=will not"
  ) else if errorlevel 1 (
  set "YourChoice=will"
  ) else if errorlevel 0 (
  goto :EOF
  )
  echo %YourChoice%
  pause

0

バッチプログラムを終了してプロンプトに戻り、プロンプト(aka cmd.exe)を閉じない場合は、「exit / b」を使用できます。

これは役立つかもしれません。

set /p _sure="Are you sure?"
::The underscore is used to ensure that "sure" is not an enviroment
::varible
if /I NOT "_sure"=="y" (
::the /I makes it so you can
exit /b
) else (
::Any other modifications...
)

または、多くの行を使用したくない場合...

Set /p _sure="Are you sure?"
if /I NOT "_sure"=="y" exit /b
::Any other modifications and commands.

お役に立てれば...


0

これは、Windows 10のバックアップ(.bat / batch)スクリプトで使用する簡単な例です。これにより、バックアップを作成するときにさまざまなオプションを使用できます。

...

:choice
set /P c=Do you want to rsync the archives to someHost[Y/N]?
if /I "%c%" EQU "Y" goto :syncthefiles
if /I "%c%" EQU "N" goto :doonotsyncthefiles
goto :choice

:syncthefiles
echo rsync files to somewhere ...
bash -c "rsync -vaz /mnt/d/Archive/Backup/ user@host:/home/user/Backup/blabla/"
echo done

:doonotsyncthefiles
echo Backup Complete!

...

これらのブロックは必要な数だけ持つことができます。


0

まず、ターミナルを開きます。

次に、

cd ~
touch .sure
chmod 700 .sure

次に、.sureを開き、中に貼り付けます。

#!/bin/bash --init-file
PS1='> '
alias y='
    $1
    exit
'
alias n='Taskkill /IM %Terminal% /f'
echo ''
echo 'Are you sure? Answer y or n.'
echo ''

その後、ファイルを閉じます。

~/.sure ; ENTER COMMAND HERE

これにより、コマンドを続行する前に本当によろしいですかというプロンプトが表示されます。


多分bashですが、バッチではありません。
ステファン

ああ。私はそうは思いません。端末コマンドでのみ機能し、バッチコマンドでは機能しません。間違った情報でごめんなさい。
user13636521

-1

端末を開きます。次のように入力します

echo>sure.sh
chmod 700 sure.sh

これをsure.shに貼り付けます

#!\bin\bash

echo -n 'Are you sure? [Y/n] '
read yn

if [ "$yn" = "n" ]; then
    exit 1
fi

exit 0

sure.shを閉じ、これをターミナルに入力します。

alias sure='~/sure&&'

コマンドを入力する前に確認を入力すると、コマンドを続行する前に確認メッセージが表示されます。

これがお役に立てば幸いです!


多分bashですが、バッチではありません。
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.