it-swarm.com.ru

Как сделать запрос «Вы уверены» в командном файле Windows?

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

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

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

76
Josh Ribakoff

Вы хотите что-то вроде:

@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
133
Joe

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

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

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

SET /P variable=[promptString]

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

13
ghostdog74

Для командной строки Windows доступны две команды:

  • set с параметром /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. ВЫБОР принимает только ключи (соответственно символы читаются из СТАНДАРТНОГО ВВОДА ) указывается после опции /C (и Ctrl+C) и выдает звуковой сигнал об ошибке, если пользователь нажимает неправильную клавишу.
  2. ВЫБОР не требует нажатия какой-либо другой клавиши, кроме одной из допустимых. ВЫБОР завершается сразу после нажатия приемлемой клавиши, пока SET/P требует, чтобы пользователь завершил ввод RETURN или же ENTER,.
  3. С помощью CHOICE можно определить опцию по умолчанию и тайм-аут, чтобы автоматически продолжить работу с опцией по умолчанию через несколько секунд, не ожидая пользователя.
  4. Вывод лучше отвечать на приглашение автоматически из другого пакетного файла, который вызывает пакетный файл с приглашением, используя что-то вроде 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 от ошибки или намеренно неправильного ввода пользователя.

Вот пример Prompt, использующий предпочтительный ВЫБОР и альтернативно 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 значение as приведет к повторному запуску запроса с параметром N, как определено по умолчанию в пакетном файле при втором выполнении запроса, что приведет к неожиданному завершению обработки пакетного файла. Да, безопасное использование SET/P действительно сложно, не так ли?

Для получения дополнительной информации об использовании SET/P и CHOICE для запроса пользователя о выборе из списка параметров см. ответ на Как остановить интерпретатор команд Windows от выхода из пакетного файла при неправильном вводе пользователем?

Еще несколько подсказок:

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

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

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

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

4
Mofi

Здесь немного проще:

@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
1
Bob Smith

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

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

1
Z. Mickaels

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

...

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

0
user2852501