Для командних підказок у командному рядку Windows доступні дві команди:
- набір з опцією,
/P
доступною у всіх версіях Windows NT з увімкненими розширеннями команд і
- choice.exe доступний за замовчуванням у Windows Vista та пізніших версіях Windows для користувачів ПК, а також у Windows Server 2003 та пізніших серверних версіях Windows.
set - це внутрішня команда командного процесора Windows cmd.exe
. Опція /P
підказувати користувачеві рядок доступна лише з увімкненими розширеннями команд, які ввімкнені за замовчуванням, оскільки інакше сьогодні майже жоден командний файл не працює.
choice.exe - це окрема консольна програма (зовнішня команда), розташована в %SystemRoot%\System32
. choice.exe
Windows Server 2003 можна скопіювати в каталог %SystemRoot%\System32
на машині з Windows XP для використання в Windows XP, як і багато інших команд, недоступних за замовчуванням у Windows XP, але доступних за замовчуванням у Windows Server 2003.
Найкращою практикою є надавати перевагу використанню CHOICE перед використанням SET / P з таких причин:
- CHOICE приймає лише клавіші (відповідно символи, зчитувані з STDIN ), вказані після опції
/C
(і Ctrl+C), і видає звуковий сигнал про помилку, якщо користувач натискає неправильну клавішу.
- ВИБІР не вимагає натискання будь-якої іншої клавіші, крім однієї з прийнятних. CHOICE виходить негайно, коли натискається прийнятна клавіша, тоді як SET / P вимагає, щоб користувач закінчив введення за допомогою RETURNабо ENTER.
- За допомогою CHOICE можна визначити параметр за замовчуванням та час очікування, щоб автоматично продовжувати параметр за замовчуванням через кілька секунд, не чекаючи користувача.
- Вихід є кращим, якщо автоматично відповідати на запит з іншого пакетного файлу, який викликає пакетний файл із запитом, використовуючи щось на зразок
echo Y | call PromptExample.bat
використання CHOICE .
- Оцінка вибору користувача набагато простіша за допомогою CHOICE, оскільки CHOICE виходить зі значенням відповідно до натиснутої клавіші (символу), яке присвоюється ERRORLEVEL, яке можна легко оцінити далі.
- Змінна середовища, яка використовується на SET / P , не визначається, якщо користувач натискає лише клавішу RETURNабо, ENTERі вона не була визначена до запиту користувача. Використана змінна середовища в командному рядку SET / P зберігає своє поточне значення, якщо це було визначено раніше, і користувач натискає лише RETURNабо ENTER.
- Користувач може вільно вводити що-небудь при запиті 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.bat
Windows 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 відмови від виконання командного файлу за неправильного вводу користувача?
Ще кілька підказок:
- IF порівнює два рядки ліворуч та праворуч від оператора порівняння, включаючи подвійні лапки. Тож порівняння без урахування регістру - це не значення
UserChoice
з N
і Y
, а значення UserChoice
оточення "
з "N"
і "Y"
.
- Оператори порівняння IF
EQU
і NEQ
призначені для первинного порівняння двох цілих чисел у діапазоні -2147483648 до 2147483647, а не для порівняння двох рядків. EQU
і NEQ
працюють також для порівняння рядків, але результатом є порівняння рядків у подвійних лапках при марній спробі перетворити лівий рядок у ціле число. EQU
і NEQ
може використовуватися лише з увімкненими розширеннями команд. Оператори порівняння для порівняння рядків є ==
і not ... ==
працюють навіть із вимкненими розширеннями команд, оскільки навіть command.com
у MS-DOS та Windows 95/98 / ME їх уже підтримували. Детальніше про оператори порівняння IF див. Символ еквівалента NEQ, LSS, GTR тощо у пакетних файлах Windows .
- Команда
goto :EOF
вимагає ввімкнених розширень команд, щоб дійсно вийти з пакетної обробки файлів. Детальніше див. Куди повертається GOTO: EOF?
Для розуміння використовуваних команд та їх роботи відкрийте вікно командного рядка, виконайте там такі команди та дуже уважно прочитайте всі сторінки довідки, що відображаються для кожної команди.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Дивитися також:
SET AREYOUSURE=N
перед підказкою, щоб очистити вибір, якщо ви вже запускали сценарій раніше у цьому командному вікні. Без нього за замовчуванням залишатиметься вибраний раніше вибір.