Вернуться к началу, если ввод не введен (Bat-файл) - PullRequest
1 голос
/ 21 июля 2011

Хорошо. Во-первых, я прошу прощения за мой плохой английский :) Теперь для моей проблемы

Я пытаюсь создать файл сценария с несколькими вариантами, и я столкнулся с проблемой. Если я не ввожу ввод (просто нажимаю ввод), файл отображает ошибку и закрывается. Теперь у меня вопрос: есть ли команда, которая заставит файл вернуться в «Пуск», если ввод не введен?

Это соответствующая часть моего сценария

:input
@echo off
CLS
ECHO   #############################################
ECHO   #                                           #
ECHO   #  1 - Make A System Folder or File         #
ECHO   #  2 - Restore Folder or File               #
Echo   #  3 - Exit                                 #
ECHO   #                                           #
ECHO   #############################################

SET /P O=Set Your Choice And Press Enter:
ECHO Loading .........
(
IF %O%==1 GOTO Hide
IF %O%==2 GOTO Show
IF %O%==3 GOTO Exit
IF %O%=="" GOTO input
) 
ELSE (
    GOTO input
)

Как видите, я пытался использовать "Else", но он работает только частично. Если я ввожу переменную, которая не является частью заданного списка (в моем случае 1, 2, 3), файл вернется в начало, и даже если я отправлю послесловие без запроса ввода, файл продолжит работать должным образом. Проблема очень специфична. Только когда первый вход не является входным, проблема возникает. в любой другой ситуации скрипт отлично работает

Спасибо и снова мне очень жаль мой плохой английский:)

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

Скобки не обязательны. Попробуйте это,

:input
@echo off
CLS
ECHO   #############################################
ECHO   #                                           #
ECHO   #  1 - Make A System Folder or File         #
ECHO   #  2 - Restore Folder or File               #
Echo   #  3 - Exit                                 #
ECHO   #                                           #
ECHO   #############################################

SET /P O=Set Your Choice And Press Enter:
ECHO Loading .........
IF %O%==1 GOTO Hide
IF %O%==2 GOTO Show
IF %O%==3 GOTO Exit
IF %O%=="" GOTO input

ELSE 
GOTO input

Кстати, ваш английский очень хорош!

1 голос
/ 21 июля 2011
  1. Всегда сбрасывать переменную перед вводом.Когда пользователь просто нажимает, введите переменную не сбрасывается автоматически.

    :: Delete variable %O%
    SET "O="
    SET /P "O=Set Your Choice And Press Enter: "
    
  2. Всегда принимать переменные в кавычках (в IF)

    IF "%O%"=="1" GOTO Hide
    IF "%O%"=="2" GOTO Show
    IF "%O%"=="3" GOTO Exit
    
  3. GOTO Label никогда не возвращается назад (исключение - goto :label в некоторых безумных случаях).В вашем случае вы можете написать:

    IF "%O%"=="1" GOTO Hide
    IF "%O%"=="2" GOTO Show
    IF "%O%"=="3" GOTO Exit
    
    GOTO INPUT
    
  4. Добавить после каждой команды процедуры exit /B, чтобы предотвратить сумасшедший анализ после изменения кода.Предупреждение: команда goto не работает как void в C ++, поэтому команда exit /B остановит сценарий.Но если вы используете call :label, команда exit /B остановит код только под :label.

0 голосов
/ 21 мая 2013

Да, если вы хотите перейти к: start или: что-либо в случае отсутствия ввода, решение напишите следующее:

эта первая строка является ключом

set num=""

set /P num=%input%

if %num%==1 goto Choice1
if %num%==2 goto Choice2

if "%num%"=="" goto Start

goto Start

Эта последняя строка предназначена для входов за пределы вашего диапазона выбора (в этом примере 3 будет недопустимым и перейдет к началу снова

Хотя есть лучшее и более простое решение!

Это просто "более профессиональное" решение для меню с множественным выбором, и оно ДЕЙСТВИТЕЛЬНО полезно ...

Вместо установки% input% и всего остального, просто используйте выбор! Если вы введете значение вне диапазона (123 означает, что вы можете выбрать 1, 2 или 3), будет «гудок», означающий недопустимый ввод.

set errorlevel=   

CHOICE /C 123  >nul
if %errorlevel%==1 goto Choice1
if %errorlevel%==2 goto Choice2
if %errorlevel%==3 goto Choice3

И это все! Намного проще, правда? Просто чтобы объяснить, что означают эти строки ...

Первая строка просто устанавливает уровень ошибки пустым, потому что, когда вы продвинетесь дальше, уровню ошибки может быть неожиданно присвоено значение. Так что избавь себя от головной боли позже и сотри ее.

> nul «скрывает» тот факт, что это выбор. Просто поместите эхо-сообщение над ним, чтобы сказать «Нажмите номер X для Варианта X». Я люблю это, потому что вам не нужно нажимать ввод потом - экономия времени, если у вас есть много вариантов

Теперь, уровень ошибки не назначил ваш вход ... так что будьте осторожны!

Мой выбор может быть «CHOICE / C 3689> nul», но выход уровня ошибки по-прежнему равен errorlevel = 1 для ввода 3, errorlevel = 2 для ввода 6 и т. Д.

Так что, если у вас есть возможность вернуться в главное меню, нажав 0, и CHOICE / C 0123, при нажатии ноль будет уровень ошибки = 1, при нажатии 1 будет уровень ошибки = 2 ... и т. Д.

Выбор супер полезен, просто зайдите и наберите выбор /? для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...