#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 )