Для подсказок пользователя в командной строке 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 от ошибочного или намеренно неправильного ввода пользователя.
Вот пример подсказки с использованием предпочтительного выбора CHOICE и альтернативы 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
with N
и Y
, а значение, UserChoice
окруженное "
with "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
перед подсказкой, чтобы очистить выбор, если вы уже запускали сценарий ранее в этом командном окне. Без него по умолчанию останется выбранный ранее выбор.