Как я могу сделать приглашение "вы уверены" в пакетном файле Windows?

У меня есть пакетный файл, который автоматизирует копирование нескольких файлов из одного места в другое и обратно для меня. Единственное, что мне мешает, я невольно удаляю эту команду из своего командного буфера и массовую перезапись неуправляемых изменений.

Какой код мне нужен для моего .bat файла, чтобы он произносил "вы уверены" и заставляете меня вводить "y" до того, как он запустил остальную часть файла? Если ничего, кроме "y", набирается, он должен выйти из этой строки.

Изменить 27 ноября Хорошо, я снова отметил это без ответа, потому что все еще не могу понять. Когда я называю "выход"; он закрывает cmd.exe, что не то, что я хочу. Все это из-за того, что Windows реализовала неверный командный буфер [по-другому, чем я, по крайней мере, используется]

Ответ 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

Ответ 2

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

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

Ответ 3

Команда choice недоступна везде. С более новыми версиями Windows команда set имеет параметр /p, который вы можете получить при вводе пользователя

SET /P variable=[promptString]

см. set /? для получения дополнительной информации

Ответ 4

Для приглашений пользователя в командной строке 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 по следующим причинам:

  1. CHOICE принимает только ключи (соответственно символы, считанные из STDIN), указанные после опции /CCtrl+C) и выдает сообщение об ошибке, если пользователь нажимает неправильный ключ.
  2. CHOICE не требует нажатия какой-либо другой клавиши, кроме одной из приемлемых. ВЫБОР выходит сразу же после нажатия на приемлемую клавишу, в то время как SET/P требует, чтобы пользователь завершил ввод с помощью RETURN или ENTER.
  3. С помощью CHOICE можно задать параметр по умолчанию и тайм-аут, чтобы автоматически продолжить установку по умолчанию через несколько секунд, не дожидаясь пользователя.
  4. Результат лучше отвечать на приглашение автоматически из другого пакетного файла, который вызывает командный файл с подсказкой, используя что-то вроде echo Y | call PromptExample.bat 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 в безопасности по ошибке или преднамеренно неправильным вводом пользователя.

Вот пример подсказки с использованием предпочтительного 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 от выхода из командного файла при некорректном вводе пользователя?

Еще несколько советов:

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

Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и тщательно прочитайте все страницы справки, отображаемые для каждой команды.

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

Смотрите также:

Ответ 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

Ответ 6

Если вы хотите, чтобы пакетная программа вернулась к приглашению и не закрыла приглашение (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.

Надеюсь, что это поможет...

Ответ 7

Вот простой пример, который я использую в сценарии резервного копирования (.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!

...

У вас может быть столько, сколько вам нужно от этих блоков.