私は、ある場所から別の場所にファイルをコピーして自動化するバッチファイルを持っています。唯一のことは、コマンドバッファーから誤ってそのコマンドを選択し続け、コミットされていない変更を大量に上書きし続けるのに役立つことです。
.batファイルに "are you sure"と表示させ、残りのファイルを実行する前に "y"と入力させるには、どのコードが必要ですか? 「y」以外を入力すると、その行で実行が終了します。
編集 11月27日Okまだわからないため、これを未回答としてマークしました。 "exit;"を呼び出すと、これはすべて、Windowsがコマンドバッファを間違って実装しているためです(少なくとも私が慣れているものとは異なります)。
次のようなものが必要です:
@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
CHOICEコマンド を試してください。
CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
choice
コマンドはどこでも利用できるわけではありません。新しいバージョンのWindowsでは、set
コマンドには/p
ユーザー入力を取得できるオプション
SET /P variable=[promptString]
見る set /?
詳細情報
Windowsコマンドラインのユーザープロンプトには、次の2つのコマンドを使用できます。
/P
で、コマンド拡張機能が有効になっているすべてのWindows NTバージョンで使用可能および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の使用よりも優先することをお勧めします。
/C
の後に指定されたキー(それぞれ[〜#〜] stdin [〜#〜])のみを受け入れます(および Ctrl+C)ユーザーが間違ったキーを押した場合にエラービープ音を出力します。echo Y | call PromptExample.bat
のようなものを使用してプロンプトでバッチファイルを呼び出す別のバッチファイルから自動的にプロンプトに応答する方が優れています。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 [〜#〜]でUserChoice
SPACE as valueは、2回目のプロンプト実行時にバッチファイルでデフォルトとして定義されているオプションN
を使用してプロンプトを2回実行し、次にバッチファイル処理の予期しない終了をもたらします。はい、SET/Pの安全な使用は本当に難しいですよね?
SET/Pおよび[〜#〜] choice [〜#〜]の使用法の詳細については、オプションのリストからユーザーに選択を促すために の回答を参照してください。間違ったユーザー入力でWindowsコマンドインタープリターがバッチファイルの実行を終了しないようにするにはどうすればよいですか?
さらにいくつかのヒント:
UserChoice
とN
およびY
の値ではなく、"
と"N"
と"Y"
で囲まれたUserChoice
の値です。EQU
およびNEQ
は、-2147483648〜2147483647の範囲の2つの整数を比較するためのものであり、2つの文字列を比較するためのものではありません。 EQU
およびNEQ
は文字列の比較にも使用できますが、左の文字列を整数に変換しようとする無駄な試みで二重引用符で文字列を比較した結果です。 EQU
およびNEQ
は、有効なコマンド拡張でのみ使用できます。文字列比較の比較演算子は==
およびnot ... ==
であり、MS-DOSおよびWindows 95/98/MEのcommand.com
でさえ既にサポートされているため、無効なコマンド拡張でも動作します。 [〜#〜] if [〜#〜]比較演算子の詳細については、 WindowsバッチファイルのNEQ、LSS、GTRなどに相当する記号 を参照してください。goto :EOF
では、バッチファイル処理を実際に終了するために、有効なコマンド拡張機能が必要です。詳細については、 GOTO:EOFはどこに戻りますか?使用するコマンドとその動作を理解するには、コマンドプロンプトウィンドウを開き、そこで次のコマンドを実行し、各コマンドについて表示されるすべてのヘルプページを注意深く読んでください。
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
こちらもご覧ください:
set "variable=value"
を使用する理由を説明しています。if errorlevel X
の動作と演算子&
の詳細については、Windowsバッチファイルを使用する複数のコマンドを含む単一行 。|
およびハンドル[〜#〜] stdin [〜#〜]の説明。SystemRoot
の説明。ここでは少し簡単です:
@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
バッチプログラムを終了してプロンプトに戻り、プロンプト(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.
お役に立てれば...
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!
...
これらのブロックを必要な数だけ持つことができます。