Для командних підказок у командному рядку 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 з таких причин:
- 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.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 відмови від виконання командного файлу за неправильного вводу користувача?
Ще кілька підказок:
- 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перед підказкою, щоб очистити вибір, якщо ви вже запускали сценарій раніше у цьому командному вікні. Без нього за замовчуванням залишатиметься вибраний раніше вибір.