Як я можу зробити запит "Ви впевнені" у пакетному файлі Windows?


94

У мене є пакетний файл, який автоматизує копіювання купу файлів з одного місця в інше і назад для мене. Єдине, наскільки мені це допомагає, я продовжую випадково вибирати цю команду з мого буфера команд і масово перезаписувати незавершені зміни.

Який код мені знадобиться для мого файлу .bat, щоб у ньому було написано "Ви впевнені", і змусити мене ввести "y", перш ніж він запустив решту файлу? Якщо введено що-небудь, крім "y", воно повинно вийти із виконання на цьому рядку.

Редагувати 27 листопада Добре, я позначив це ще раз без відповіді, оскільки досі не можу зрозуміти. Коли я закликаю "вихід;" він закриває 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

4
@Igal Я майже впевнений, що про setlocalце endlocalповинні подбати. %AREYOUSURE%не буде більше існувати після endlocal.

1
@dudeprgm ти, мабуть, маєш рацію. Я думаю, що мені не вистачило того, що міститься в моєму коді.
isapir

2
... було б цінніше з деякими пояснювальними словами про важливі два рядки .
Вовк

@Joe Може бути, він не може, бо (як і я) їх (поки) не розуміє. Отже, якщо ви це зробите, було б чудово, якби ви могли розширити свою відповідь або посилання на ресурси, що пояснюють це :)
Маркус

33

спробуйте команду CHOICE , наприклад

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

8
<похизуватися> Хоча це порівняно нове. Він був доданий у MS-DOS 6 у 1993 або 1994 роках, тому він може працювати не з усіма реалізаціями </ show off>
Натан Феллман

7
приклад того, як насправді використовувати вибір тут computerhope.com/issues/ch001674.htm
Метью Лок

15

choiceКоманда недоступна всюди. У новіших версіях Windows setкоманда має /pопцію, яку ви можете отримати від користувача

SET /P variable=[promptString]

див. set /?для отримання додаткової інформації


... набагато проникливіший за прийнятий, але ми, очевидно, живемо в невідкладні часи.
Вовк

10

Для командних підказок у командному рядку Windows доступні дві команди:

  • набір з опцією, /Pдоступною у всіх версіях Windows NT з увімкненими розширеннями команд і
  • choice.exe доступний за замовчуванням у Windows Vista та пізніших версіях Windows для користувачів ПК, а також у Windows Server 2003 та пізніших серверних версіях Windows.

set - це внутрішня команда командного процесора Windows cmd.exe. Опція /Pпідказувати користувачеві рядок доступна лише з увімкненими розширеннями команд, які ввімкнені за замовчуванням, оскільки інакше сьогодні майже жоден командний файл не працює.

choice.exe - це окрема консольна програма (зовнішня команда), розташована в %SystemRoot%\System32. choice.exeWindows Server 2003 можна скопіювати в каталог %SystemRoot%\System32на машині з Windows XP для використання в Windows XP, як і багато інших команд, недоступних за замовчуванням у Windows XP, але доступних за замовчуванням у Windows Server 2003.

Найкращою практикою є надавати перевагу використанню CHOICE перед використанням SET / P з таких причин:

  1. CHOICE приймає лише клавіші (відповідно символи, зчитувані з STDIN ), вказані після опції /CCtrl+C), і видає звуковий сигнал про помилку, якщо користувач натискає неправильну клавішу.
  2. ВИБІР не вимагає натискання будь-якої іншої клавіші, крім однієї з прийнятних. CHOICE виходить негайно, коли натискається прийнятна клавіша, тоді як SET / P вимагає, щоб користувач закінчив введення за допомогою RETURNабо ENTER.
  3. За допомогою CHOICE можна визначити параметр за замовчуванням та час очікування, щоб автоматично продовжувати параметр за замовчуванням через кілька секунд, не чекаючи користувача.
  4. Вихід є кращим, якщо автоматично відповідати на запит з іншого пакетного файлу, який викликає пакетний файл із запитом, використовуючи щось на зразок echo Y | call PromptExample.batвикористання CHOICE .
  5. Оцінка вибору користувача набагато простіша за допомогою CHOICE, оскільки CHOICE виходить зі значенням відповідно до натиснутої клавіші (символу), яке присвоюється ERRORLEVEL, яке можна легко оцінити далі.
  6. Змінна середовища, яка використовується на SET / P , не визначається, якщо користувач натискає лише клавішу RETURNабо, ENTERі вона не була визначена до запиту користувача. Використана змінна середовища в командному рядку SET / P зберігає своє поточне значення, якщо це було визначено раніше, і користувач натискає лише RETURNабо ENTER.
  7. Користувач може вільно вводити що-небудь при запиті SET / P, включаючи рядок, що в подальшому призводить до виходу з виконання командного файлу cmdчерез синтаксичну помилку або виконання команд, які взагалі не включені в командний файл на не хороший закодований пакетний файл. Потрібні певні зусилля, щоб захистити SET / P від помилки або навмисно неправильного вводу користувача.

Ось швидкий приклад використання переважного ВИБОРУ, а також SET / P на choice.exeнедоступному на використаному комп’ютері під управлінням 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 ...

Примітка: Цей пакетний файл використовує розширення команд, які недоступні в Windows 95/98 / ME, command.comа не cmd.exeяк інтерпретатор команд.

Командний рядок set "UserChoice=!UserChoice: =!"додано, щоб зробити можливим виклик цього командного файлу за допомогою echo Y | call PromptExample.batWindows NT4 / 2000 / XP і не вимагає використання echo Y| call PromptExample.bat. Він видаляє всі пробіли з рядка, прочитаного зі STDIN, перед запуском двох порівнянь рядків.

echo Y | call PromptExample.batпризводить до того, що YSPACE призначається змінній середовища UserChoice. Це призведе до обробки запиту двічі, оскільки не "Y "є чутливим до регістру, "N"або "Y"не видаляючи спочатку всі пробіли. Таким чином , UserChoiceз YSPACE в якості значення призведе запуск швидке вдруге з параметром , Nяк визначено за замовчуванням в пакетному файлі на другий оперативне виконання яких наступна призводить до неочікуваного виходу з пакетної обробки файлів. Так, безпечне використання SET / P насправді складне, чи не так?

Детальніше про використання SET / P та CHOICE для підказування користувачеві вибору зі списку параметрів див. У відповіді про те, як зупинити інтерпретатор команд Windows відмови від виконання командного файлу за неправильного вводу користувача?

Ще кілька підказок:

  1. IF порівнює два рядки ліворуч та праворуч від оператора порівняння, включаючи подвійні лапки. Тож порівняння без урахування регістру - це не значення UserChoiceз Nі Y, а значення UserChoiceоточення "з "N"і "Y".
  2. Оператори порівняння IFEQU і NEQпризначені для первинного порівняння двох цілих чисел у діапазоні -2147483648 до 2147483647, а не для порівняння двох рядків. EQUі NEQпрацюють також для порівняння рядків, але результатом є порівняння рядків у подвійних лапках при марній спробі перетворити лівий рядок у ціле число. EQUі NEQможе використовуватися лише з увімкненими розширеннями команд. Оператори порівняння для порівняння рядків є ==і not ... ==працюють навіть із вимкненими розширеннями команд, оскільки навіть command.comу MS-DOS та Windows 95/98 / ME їх уже підтримували. Детальніше про оператори порівняння IF див. Символ еквівалента NEQ, LSS, GTR тощо у пакетних файлах Windows .
  3. Команда goto :EOFвимагає ввімкнених розширень команд, щоб дійсно вийти з пакетної обробки файлів. Детальніше див. Куди повертається GOTO: EOF?

Для розуміння використовуваних команд та їх роботи відкрийте вікно командного рядка, виконайте там такі команди та дуже уважно прочитайте всі сторінки довідки, що відображаються для кожної команди.

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

Дивитися також:


1
Це неймовірна відповідь. Відтепер я використовую лише Choice.exe.
Бас

choice.exe також був у DOS з 6.0
Брайан Мінтон,

@BrianMinton Це не правильно. За CHOICE.COMзамовчуванням була доступна 16-розрядна програма на MS-DOS 6.0, MS-DOS 7.0, Windows 95 та Windows 98. Але choice.exeза замовчуванням її не було встановлено на Windows NT4, Windows 2000 та Windows XP. CHOICE.COMможе використовуватися також на NT4, Windows 2000 та Windows XP, але було б краще використовувати 32-розрядну версію choice.exeз відповідного набору ресурсів. Дивіться сторінку Роб ван дер Вуде про ВИБІР . Варіанти частково відрізняються між CHOICE.COMі choice.exe. Однак питання не в DOS.
Мофі

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%це завжди ціле значення. Дивіться тут документацію, включаючи приклад.
Stephan

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

Ось простий приклад, який я використовую в сценарії резервного копіювання (.bat / batch) у Windows 10, що дозволяє мені мати різні варіанти під час створення резервних копій.

...

: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, але точно не в пакетному режимі.
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.