web-dev-qa-db-ja.com

Windowsバッチファイルで「本当に」プロンプトを作成するにはどうすればよいですか?

私は、ある場所から別の場所にファイルをコピーして自動化するバッチファイルを持っています。唯一のことは、コマンドバッファーから誤ってそのコマンドを選択し続け、コミットされていない変更を大量に上書きし続けるのに役立つことです。

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

編集 11月27日Okまだわからないため、これを未回答としてマークしました。 "exit;"を呼び出すと、これはすべて、Windowsがコマンドバッファを間違って実装しているためです(少なくとも私が慣れているものとは異なります)。

77
Josh Ribakoff

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

@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
136
Joe

CHOICEコマンド を試してください。

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
27
Steven A. Lowe

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

SET /P variable=[promptString]

見る set /?詳細情報

13
ghostdog74

Windowsコマンドラインのユーザープロンプトには、次の2つのコマンドを使用できます。

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

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

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

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

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

[〜#〜] choice [〜#〜]と、Windowsを実行している使用中のコンピューターでは使用できないchoice.exe上のSET/Pを使用したプロンプトの例を次に示します。

@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 ...

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

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

echo Y | call PromptExample.bat[〜#〜] y [〜#〜]になりますSPACE 環境変数UserChoiceに割り当てられます。 "Y "は、最初にすべてのスペースを削除せずに、大文字と小文字を区別しない"N"でも"Y"でもないため、プロンプトを2回処理することになります。 [〜#〜] y [〜#〜]UserChoiceSPACE as valueは、2回目のプロンプト実行時にバッチファイルでデフォルトとして定義されているオプションNを使用してプロンプトを2回実行し、次にバッチファイル処理の予期しない終了をもたらします。はい、SET/Pの安全な使用は本当に難しいですよね?

SET/Pおよび[〜#〜] choice [〜#〜]の使用法の詳細については、オプションのリストからユーザーに選択を促すために の回答を参照してください。間違ったユーザー入力でWindowsコマンドインタープリターがバッチファイルの実行を終了しないようにするにはどうすればよいですか?

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

  1. [〜#〜] if [〜#〜]は、比較演算子の左右の2つの文字列を、二重引用符のを含むと比較します。したがって、大文字と小文字を区別しない比較は、UserChoiceNおよびYの値ではなく、""N""Y"で囲まれたUserChoiceの値です。
  2. [〜#〜] if [〜#〜]比較演算子EQUおよびNEQは、-2147483648〜2147483647の範囲の2つの整数を比較するためのものであり、2つの文字列を比較するためのものではありません。 EQUおよびNEQは文字列の比較にも使用できますが、左の文字列を整数に変換しようとする無駄な試みで二重引用符で文字列を比較した結果です。 EQUおよびNEQは、有効なコマンド拡張でのみ使用できます。文字列比較の比較演算子は==およびnot ... ==であり、MS-DOSおよびWindows 95/98/MEのcommand.comでさえ既にサポートされているため、無効なコマンド拡張でも動作します。 [〜#〜] if [〜#〜]比較演算子の詳細については、 WindowsバッチファイルのNEQ、LSS、GTRなどに相当する記号 を参照してください。
  3. コマンドgoto :EOFでは、バッチファイル処理を実際に終了するために、有効なコマンド拡張機能が必要です。詳細については、 GOTO:EOFはどこに戻りますか?

使用するコマンドとその動作を理解するには、コマンドプロンプトウィンドウを開き、そこで次のコマンドを実行し、各コマンドについて表示されるすべてのヘルプページを注意深く読んでください。

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

こちらもご覧ください:

6
Mofi

ここでは少し簡単です:

@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
1
Bob Smith

バッチプログラムを終了してプロンプトに戻り、プロンプト(A.K.A 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.

お役に立てれば...

1
Z. Mickaels

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

...

: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
user2852501