Вызов функции управления с использованием пользовательского ввода: пакетное

#batch-file

#пакетный файл

Вопрос:

Я хотел бы написать пакетный файл, который работает в соответствии с вводом, полученным от пользователя, но в моем коде он всегда вызывает функцию «AddingFile».

 @ECHO off

ECHO Select [A] Adding File [R] Remove File [C] Copy File [E] Close Program.

GOTO:startCompile


:startCompile
::CLS

SET /p select = Make a selection. 

IF "%select%"=="1" ( goto addingFileObject )
IF "%select%"=="2" ( goto removeFileObject )
IF "%select%"=="3" ( goto copy )
IF "%select%"=="4" ( goto defaultExit )

:addingFile
ECHO "Adding files"
goto:EOF

:removeFile
ECHO "Remove files"
goto:EOF

:defaultExit
pause
goto:EOF

:copy
ECHO "Copying Filed"
goto:EOF
  

Комментарии:

1. Удалите пространство из SET /p select<space>= . И вам нужно goto :eof после вашего IF-Block

2. если я использую его goto:eof после IF-BLOCK- него, выйдите из кода напрямую, не выполняя ни одной функции.

3. В настоящее время выполнение продолжается в :addingFile разделе, когда ваш выбор отличается от 1 , 2 , 3 4 , goto : , for example. Anyway, take a look at the [ , поэтому вы должны, по крайней мере, определить какое-либо поведение по умолчанию в таком случае, например, defaultExit[`команда выбора по умолчанию](,,ss64.com/nt/choice.html ), который не позволяет пользователю вводить что-либо еще, кроме предопределенных вариантов…

Ответ №1:

… и использование более подходящей Choice команды:

 @Echo Off
Choice /C ARCE /N /M "Select [A]dd [R]emove [C]opy or [E]xit"
If ErrorLevel 4 GoTo :EOF
If ErrorLevel 3 GoTo copy
If ErrorLevel 2 GoTo removeFile

Echo "Adding files"
Timeout 2 /NoBreak>Nul
Exit /B

:removeFile
Echo "Remove files"
Timeout 2 /NoBreak>Nul
Exit /B

:copy
Echo "Copying Files"
Timeout 2 /NoBreak>Nul
  

Ответ №2:

Код содержит две ошибки.

Строка SET /P select<space>=... неверна или, по крайней мере, приводит к неожиданному поведению.
Он устанавливает переменную с именем, select<space> поэтому доступ через %select% всегда будет неудачным.

После блока exit /b команд отсутствует goto :eof или IF , что приводит к некорректному поведению, когда ни одно из IF-сравнений не соответствует действительности.
Затем будет выполнена часть addingFile.

Кстати. Такие проблемы можно просто отладить с помощью ECHO ON . В этом случае это показало бы вторую проблему с помощью этих строк, %select% всегда пусто

 ...
c:Temp>IF "" == "1" (goto addingFileObject  )
c:Temp>IF "" == "2" (goto removeFileObject  )
c:Temp>IF "" == "3" (goto copy  )
c:Temp>IF "" == "4" (goto defaultExit  )