Bagaimana saya bisa membuat prompt "apakah Anda yakin" di batchfile Windows?

95

Saya memiliki file batch yang secara otomatis menyalin banyak file dari satu tempat ke tempat lain dan kembali untuk saya. Hanya masalahnya adalah sebanyak itu membantu saya, saya terus secara tidak sengaja memilih perintah itu dari buffer perintah saya dan menimpa perubahan yang tidak terikat secara massal.

Kode apa yang saya perlukan untuk file .bat saya untuk membuatnya bertuliskan "apakah kamu yakin", dan membuat saya mengetik "y" sebelum file itu menjalankan sisa file? Jika ada selain "y" yang diketik itu harus keluar dari eksekusi pada baris itu.

Sunting 27 Nov Ok saya tandai ini belum dijawab lagi karena saya masih tidak bisa memahaminya. Ketika saya memanggil "keluar;" itu menutup cmd.exe yang bukan yang saya inginkan. Semua ini karena Windows menerapkan buffer perintah yang salah [berbeda dari yang biasa saya lakukan setidaknya]

Josh Ribakoff
sumber

Jawaban:

170

Anda menginginkan sesuatu seperti:

@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
Joe
sumber
5
Satu-satunya hal yang akan saya tambahkan adalah tambahan SET AREYOUSURE=Nsebelum prompt untuk menghapus pilihan jika Anda sudah menjalankan skrip sebelumnya di jendela perintah itu. Tanpanya default akan tetap menjadi pilihan yang dipilih sebelumnya.
isapir
4
@Igal Saya cukup yakin bahwa setlocaldan itu endlocalharus mengurusnya. %AREYOUSURE%tidak akan ada lagi setelah endlocal.
1
@Dudrrh Anda mungkin benar. Saya pikir saya melewatkannya di kode saya.
isapir
2
... akan lebih berharga dengan beberapa kata penjelasan tentang dua baris penting .
Wolf
@ Joe Mungkin dia tidak bisa karena (seperti saya) dia belum (belum) mengerti mereka. Jadi jika Anda melakukannya, akan luar biasa jika Anda dapat memperluas jawaban Anda atau tautan ke sumber daya yang menjelaskannya :)
Marcus Mangelsdorf
34

coba perintah PILIHAN , mis

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
Steven A. Lowe
sumber
8
<show off> Meskipun ini relatif baru. Itu ditambahkan di MS-DOS 6 pada tahun 1993 atau 1994, jadi mungkin tidak bekerja dengan semua implementasi </ show off>
Nathan Fellman
7
contoh bagaimana sebenarnya menggunakan pilihan di sini computerhope.com/issues/ch001674.htm
Matthew Lock
Ini bekerja dengan sempurna pada Windows 10 cmd.
Braulio J. Solano
17

The choiceperintah ini tidak tersedia di mana-mana. Dengan versi Windows yang lebih baru, setperintah memiliki /popsi untuk mendapatkan masukan pengguna

SET /P variable=[promptString]

lihat set /?untuk info lebih lanjut

anjing hantu74
sumber
... jauh lebih berwawasan daripada yang diterima, tapi jelas kita hidup di masa-masa mendesak.
Wolf
12

Ada dua perintah yang tersedia untuk petunjuk pengguna di baris perintah windows:

  • diatur dengan opsi yang /Ptersedia di semua versi Windows NT dengan ekstensi perintah yang diaktifkan dan
  • choice.exe tersedia secara default di Windows Vista dan versi Windows yang lebih baru untuk pengguna PC dan di Windows Server 2003 dan Windows versi server yang lebih baru.

set adalah perintah internal prosesor perintah Windows cmd.exe. Opsi /Puntuk meminta pengguna untuk string hanya tersedia dengan ekstensi perintah yang diaktifkan yang diaktifkan secara default karena jika tidak, hampir tidak ada file batch yang akan berfungsi lagi saat ini.

choice.exe adalah aplikasi konsol terpisah (perintah eksternal) yang terletak di %SystemRoot%\System32. choice.exeWindows Server 2003 dapat disalin ke direktori %SystemRoot%\System32pada mesin Windows XP untuk digunakan pada Windows XP seperti banyak perintah lain yang tidak tersedia secara default pada Windows XP, tetapi tersedia secara default pada Windows Server 2003.

Merupakan praktik terbaik untuk lebih memilih penggunaan PILIHAN daripada penggunaan SET / P karena alasan berikut:

  1. PILIHAN hanya menerima kunci (masing-masing karakter dibaca dari STDIN ) yang ditentukan setelah opsi /C(dan Ctrl+C) dan mengeluarkan bunyi bip kesalahan jika pengguna menekan tombol yang salah.
  2. PILIHAN tidak perlu menekan tombol lain selain salah satu tombol yang dapat diterima. CHOICE keluar segera setelah tombol yang dapat diterima ditekan sementara SET / P mengharuskan pengguna menyelesaikan input dengan RETURNatau ENTER.
  3. Dengan PILIHAN, Anda dapat menentukan opsi default dan batas waktu untuk melanjutkan secara otomatis dengan opsi default setelah beberapa detik tanpa menunggu pengguna.
  4. Outputnya lebih baik dalam menjawab prompt secara otomatis dari file batch lain yang memanggil file batch dengan prompt menggunakan sesuatu seperti echo Y | call PromptExample.batmenggunakan PILIHAN .
  5. Evaluasi pilihan pengguna jauh lebih mudah dengan PILIHAN karena PILIHAN keluar dengan nilai sesuai dengan tombol yang ditekan (karakter) yang ditetapkan ke ERRORLEVEL yang dapat dengan mudah dievaluasi selanjutnya.
  6. Variabel lingkungan yang digunakan pada SET / P tidak ditentukan jika pengguna hanya menekan tombol RETURNatau ENTERdan itu tidak ditentukan sebelum meminta pengguna. Variabel lingkungan yang digunakan pada baris perintah SET / P mempertahankan nilainya saat ini jika ditentukan sebelumnya dan pengguna hanya menekan RETURNatau ENTER.
  7. Pengguna memiliki kebebasan untuk memasukkan apa pun saat diminta dengan SET / P termasuk string yang kemudian mengakibatkan keluarnya eksekusi file batch cmdkarena kesalahan sintaks, atau dalam pelaksanaan perintah yang tidak disertakan sama sekali dalam file batch pada tidak file batch berkode bagus. Diperlukan upaya agar SET / P aman dari kesalahan input pengguna atau sengaja salah.

Berikut adalah contoh cepat menggunakan PILIHAN yang disukai dan sebagai alternatif SET / P pada choice.exetidak tersedia pada komputer bekas yang menjalankan Windows.

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

Catatan: File batch ini menggunakan ekstensi perintah yang tidak tersedia di Windows 95/98 / ME menggunakan command.comalih-alih cmd.exesebagai penerjemah perintah.

Baris perintah set "UserChoice=!UserChoice: =!"ditambahkan untuk memungkinkan untuk memanggil file batch ini dengan echo Y | call PromptExample.batpada Windows NT4 / 2000 / XP dan tidak memerlukan penggunaan echo Y| call PromptExample.bat. Ini menghapus semua spasi dari string yang dibaca dari STDIN sebelum menjalankan perbandingan dua string.

echo Y | call PromptExample.batmenghasilkan YSPACE ditugaskan ke variabel lingkungan UserChoice. Itu akan mengakibatkan pemrosesan prompt dua kali karena "Y "tidak peka huruf besar / kecil sama "N"atau "Y"tanpa menghapus semua spasi terlebih dahulu. Jadi UserChoicedengan YSPACE sebagai nilai akan menghasilkan menjalankan prompt untuk kedua kalinya dengan opsi yang Ndidefinisikan sebagai default dalam file batch pada eksekusi prompt kedua yang selanjutnya menghasilkan keluarnya pemrosesan file batch yang tidak terduga. Ya, keamanan penggunaan SET / P memang rumit, bukan?

Untuk detail lebih lanjut tentang penggunaan SET / P dan PILIHAN untuk meminta pengguna memilih dari daftar opsi, lihat jawaban di Bagaimana cara menghentikan penerjemah perintah Windows dari menghentikan eksekusi file batch pada input pengguna yang salah?

Beberapa petunjuk lagi:

  1. IF membandingkan dua string kiri dan kanan operator perbandingan dengan menyertakan tanda kutip ganda. Sehingga kasus-sensitif dibandingkan bukanlah nilai UserChoicedengan Ndan Y, tetapi nilai UserChoiceyang dikelilingi oleh "dengan "N"dan "Y".
  2. The JIKA operator perbandingan EQUdan NEQdirancang utama untuk membandingkan dua bilangan bulat dalam jangkauan -2147483648 sampai 2147483647 dan bukan untuk membandingkan dua string. EQUdan NEQjuga berfungsi untuk perbandingan string, tetapi hasil dari membandingkan string dalam tanda kutip ganda pada upaya yang tidak berguna untuk mengubah string kiri menjadi integer. EQUdan hanya NEQdapat digunakan dengan ekstensi perintah yang diaktifkan. Operator perbandingan untuk perbandingan string sedang ==dan not ... ==yang bekerja bahkan dengan ekstensi perintah yang dinonaktifkan karena bahkan command.comMS-DOS dan Windows 95/98 / ME sudah mendukungnya. Untuk detail selengkapnya tentang operator perbandingan IF, lihat Simbol yang setara dengan NEQ, LSS, GTR, dll. Di file batch Windows .
  3. Perintah ini goto :EOFmembutuhkan ekstensi perintah yang diaktifkan untuk benar-benar keluar dari pemrosesan file batch. Untuk lebih jelasnya lihat Ke mana GOTO: EOF kembali?

Untuk memahami perintah yang digunakan dan cara kerjanya, buka jendela prompt perintah, jalankan perintah berikut di sana, dan baca seluruhnya semua halaman bantuan yang ditampilkan untuk setiap perintah dengan sangat hati-hati.

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

Lihat juga:

Mofi
sumber
2
Ini jawaban yang luar biasa. Saya hanya menggunakan Choice.exe mulai sekarang.
Bas
1
choice.exe juga ada di DOS sejak 6.0
Brian Minton
1
@ Brianinton Itu tidak benar. Tersedia aplikasi 16-bit CHOICE.COMsecara default pada MS-DOS 6.0, MS-DOS 7.0, Windows 95 dan Windows 98. Tetapi tidak ada yang choice.exediinstal secara default pada Windows NT4, Windows 2000 dan Windows XP. CHOICE.COMdapat digunakan juga pada NT4, Windows 2000 dan Windows XP, tetapi akan lebih baik jika menggunakan 32-bit choice.exedari kit sumber daya yang sesuai. Lihat halaman Rob van der Woude tentang PILIHAN . Opsinya sebagian berbeda antara CHOICE.COMdan choice.exe. Namun, pertanyaannya bukan tentang DOS.
Mofi
5

Di sini sedikit lebih mudah:

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

atau

@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
Bob Smith
sumber
setelah Y letakkan perintah yang Anda inginkan terjadi. Itulah ... untuk :)
Bob Smith
Maksud saya: %errorlevel%selalu merupakan nilai integer. Lihat di sini untuk dokumentasi termasuk contoh.
Stephan
1

Inilah metode masuk saya untuk jawaban ya / tidak .

Ini juga tidak peka huruf besar / kecil.

Ini hanya memeriksa kesalahan yang diberikan oleh input dan mengatur choicevariabel ke apa pun yang Anda butuhkan sehingga dapat digunakan di bawah ini dalam kode.

@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
Ste
sumber
0

Jika Anda ingin program batch keluar kembali ke prompt dan tidak menutup prompt (AKA cmd.exe), Anda dapat menggunakan "exit / b".

Ini mungkin membantu.

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

Atau jika Anda tidak ingin menggunakan banyak baris ...

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

Semoga ini membantu...

Z. Mickaels
sumber
0

Berikut adalah contoh sederhana yang saya gunakan dalam skrip cadangan (.bat / batch) pada Windows 10, yang memungkinkan saya memiliki opsi berbeda saat membuat cadangan.

...

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

...

Anda dapat memiliki blok ini sebanyak yang Anda butuhkan.


sumber
0

Pertama, buka terminal.

Lalu, ketik

cd ~
touch .sure
chmod 700 .sure

Selanjutnya, buka .sure dan tempelkan ini di dalam.

#!/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 ''

Setelah itu, tutup file tersebut.

~/.sure ; ENTER COMMAND HERE

Ini akan memberi Anda prompt apakah Anda yakin sebelum melanjutkan perintah.

pengguna13636521
sumber
Mungkin dalam bash, tapi yang pasti tidak secara batch.
Stephan
Oh. Saya rasa tidak. Ini hanya berfungsi untuk perintah terminal bukan perintah batch. Maaf atas informasi yang salah.
user13636521
0

Anda dapat mempertimbangkan untuk menggunakan konfirmasi UI.

Dengan yesnopopup.bat

@echo off

for /f "tokens=* delims=" %%# in ('yesnopopup.bat') do (
    set "result=%%#"
)

if /i result==no (
    echo user rejected the script
    exit /b 1
) 

echo continue

rem --- other commands --

pengguna akan melihat yang berikut dan bergantung pada pilihan skrip akan melanjutkan:

masukkan deskripsi gambar di sini

dengan script yang benar-benar sama Anda juga dapat menggunakan iexpYNbutton.bat yang akan menghasilkan popup serupa.

Dengan buttons.bat Anda dapat mencoba skrip berikut:

@echo off

for /f "tokens=* delims=" %%# in ('buttons.bat "Yep!" "Nope!" ') do (
    set "result=%%#"
)

if /i result==2 (
    echo user rejected the script
    exit /b 1
) 

echo continue

rem --- other commands --

dan pengguna akan melihat:

masukkan deskripsi gambar di sini

npocmaka
sumber
-2

Buka terminal. Ketik berikut ini

echo>sure.sh
chmod 700 sure.sh

Tempel ini di dalam sure.sh

#!\bin\bash

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

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

exit 0

Tutup sure.sh dan ketik ini di terminal.

alias sure='~/sure&&'

Sekarang, jika Anda mengetik yakin sebelum mengetik perintah itu akan memberi Anda prompt apakah Anda yakin sebelum melanjutkan perintah.

Semoga bermanfaat!

Kontributor Anonim
sumber
Mungkin dalam bash, tapi yang pasti tidak secara batch.
Stephan