Ответ 1
Вам нужно что-то вроде:
@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
У меня есть пакетный файл, который автоматизирует копирование нескольких файлов из одного места в другое и обратно для меня. Единственное, что мне мешает, я невольно удаляю эту команду из своего командного буфера и массовую перезапись неуправляемых изменений.
Какой код мне нужен для моего .bat файла, чтобы он произносил "вы уверены" и заставляете меня вводить "y" до того, как он запустил остальную часть файла? Если ничего, кроме "y", набирается, он должен выйти из этой строки.
Изменить 27 ноября Хорошо, я снова отметил это без ответа, потому что все еще не могу понять. Когда я называю "выход"; он закрывает cmd.exe, что не то, что я хочу. Все это из-за того, что Windows реализовала неверный командный буфер [по-другому, чем я, по крайней мере, используется]
Вам нужно что-то вроде:
@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
попробуйте команду CHOICE, например
CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
Команда choice
недоступна везде. С более новыми версиями Windows команда set
имеет параметр /p
, который вы можете получить при вводе пользователя
SET /P variable=[promptString]
см. set /?
для получения дополнительной информации
Для приглашений пользователя в командной строке Windows доступны две команды:
/P
доступна на всех версиях Windows NT с поддержкой расширений команд и 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 по следующим причинам:
/C
(и Ctrl+C) и выдает сообщение об ошибке, если пользователь нажимает неправильный ключ.echo Y | call PromptExample.bat
echo Y | call PromptExample.bat
при использовании CHOICE.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 go ...
Примечание. Этот командный файл использует расширения команд, которые недоступны в Windows 95/98/ME, используя command.com
вместо cmd.exe
качестве интерпретатора команд.
В командной строке set "UserChoice=!UserChoice: =!"
добавляется, чтобы вызвать этот пакетный файл с echo Y | call PromptExample.bat
echo Y | call PromptExample.bat
в Windows NT4/2000/XP и не требуйте использования echo Y| call PromptExample.bat
echo Y| call PromptExample.bat
. Он удаляет все пробелы из строки, считанной из STDIN, перед запуском двух сравнения строк.
echo Y | call PromptExample.bat
echo Y | call PromptExample.bat
приводит к тому, что Y SPACE получает назначение переменной среды UserChoice
. Это приведет к обработке запроса дважды, потому что "Y "
не учитывает регистр, равно "N"
или "Y"
не удаляя сначала все пробелы. Таким образом, UserChoice
с Y SPACE как значение приведет к запуску запроса во второй раз с опцией N
как определено по умолчанию в пакетном файле при выполнении второго запроса, что в результате приведет к неожиданному завершению обработки пакетного файла. Да, безопасное использование SET/P действительно сложно, не так ли?
Для получения более подробной информации об использовании SET/P и CHOICE для запроса пользователю выбрать из списка вариантов см. Ответ о том, как остановить интерпретатор команд Windows от выхода из командного файла при некорректном вводе пользователя?
Еще несколько советов:
UserChoice
с N
и Y
, но значение UserChoice
окружено "
с "N"
и "Y"
.EQU
и NEQ
предназначены для сравнения двух целых чисел в диапазоне -2147483648 до 2147483647, а не для сравнения двух строк. EQU
и NEQ
работают также для сопоставлений строк, но результат сравнения строк в двойных кавычках при бесполезной попытке преобразования левой строки в целое. EQU
и NEQ
могут использоваться только с включенными расширениями команд. Операторы сравнения для сравнения строк - это ==
и not... ==
которые работают даже с отключенными расширениями команд, поскольку даже command.com
из MS-DOS и Windows 95/98/ME уже поддерживал их. Более подробную информацию о операторах сравнения IF см. В Symbian, эквивалентном NEQ, LSS, GTR и т.д. В командных файлах Windows.goto :EOF
требует, чтобы расширенные расширения команд действительно выходили из обработки пакетного файла. Подробнее см. Где GOTO: EOF возвращается?Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и тщательно прочитайте все страницы справки, отображаемые для каждой команды.
choice/?
echo/?
endlocal/?
goto/?
if/?
set/?
setlocal/?
Смотрите также:
set "variable=value"
при присвоении строки переменной окружения.if errorlevel X
поведение if errorlevel X
и оператор &
.|
и обрабатывать STDIN.SystemRoot
.Здесь немного проще:
@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
Если вы хотите, чтобы пакетная программа вернулась к приглашению и не закрыла приглашение (A.K.A 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.
Надеюсь, что это поможет...
Вот простой пример, который я использую в сценарии резервного копирования (.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/ [email protected]:/home/user/Backup/blabla/"
echo done
:doonotsyncthefiles
echo Backup Complete!
...
У вас может быть столько, сколько вам нужно от этих блоков.