Можно ли передать переменную через GOTO или CALL, но закончить без возврата? - PullRequest
0 голосов
/ 25 мая 2018

Допустим, у вас есть такой пакетный файл:

@echo off
setlocal

:part1
echo.
echo Part 1: Your Name
echo.
if "%1"=="err1" echo * You must supply a name! *&echo.
echo Please enter your name below.
echo.
set /p yourName=": "
if "%yourName%"=="" call :part1 err1
if /i "%yourName%"=="/q" goto :eof
goto :part2

:part2
echo.
echo Part 2: Your Age
echo.
if "%1"=="err1" echo * You must supply your age! *&echo.
echo Please enter your age below.
echo.
set /p yourAge=": "
if "%yourAge%"=="" call :part2 err1
if /i "%yourAge%"=="/q" goto :eof
goto :part3

:part3
echo.
echo Part 3: Your Favorite Number
echo.
if "%1"=="err1" echo * You must supply the number! *&echo.
echo Please enter your favorite number below.
echo.
set /p yourNum=": "
if "%yourNum%"=="" call :part3 err1
if /i "%yourNum%"=="/q" goto :eof
goto :part4

:part4
echo.
echo We're done!
echo.
echo Thanks %yourName%, I now know you are %yourAge% and like # %yourNum%!
goto :eof

Я хочу проверить ввод, а также иметь возможность прерывать процесс на каждом шаге.Это работает великолепно;пока кто-то не облажается и не запускает проверку.Я попытался перейти к: label err1, но GOTO не позволяет передавать параметры.Поэтому я перешел на CALL.Проблемы 1, кажется, что% 1 сохраняется, потому что после того, как я пытаюсь ввести пустое имя, он кричит на меня, чтобы ввести имя.Я делаю, затем на следующем экране сразу же кричит, что я должен ввести возраст, хотя у меня еще не было шанса.Вторая проблема заключается в том, что если я пытаюсь завершить работу, goto: eof просто закрывает цикл CALL и отправляет меня туда, откуда возник CALL, и продолжается.

Каков правильный способ справиться с этим ??Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Буквально понимать заголовок вашего вопроса:

  1. Можно ли передать переменную через GOTO?
    Нет, вы не можете передать данные через goto :label, используя переменную.
  2. может ли один CALL, но конец без возврата?
    Нет, goto :eof или exit /b или неявное достижение конца файла в вызываемой подпрограмме возвращает вызывающей стороне, но:

вы можете передать обратно уровень ошибки и действовать в соответствии с ним с помощью условного выполнения

  • (|| при неудаче / && при успехе) или
  • проверка if errorlevel 1.

@echo off
for /l %%i in (1,1,100) do call :Check %%i || goto :End
Echo Past for
:End
Echo Label End
pause
goto :Eof
:Check
Echo Check %1
if %1==5 Exit /B 1

Пример вывода:

> SO_50525014.cmd
Check 1
Check 2
Check 3
Check 4
Check 5
Label End
0 голосов
/ 25 мая 2018

Вы можете немного изменить свой поток.
И вы должны удалить любую переменную, которую вы используете позже, с помощью set / p, так как set / p не меняет переменную, когда пользователь нажимает только ввод

@echo off
setlocal

call :getName
if /i "%yourName%"=="/q" goto :eof
call :getAge
if /i "%yourAge%"=="/q" goto :eof
exit /b

:getName
echo(
echo Part 1: Your Name
echo(
echo Please enter your name below.
echo(
set "yourName="
set /p yourName=": "
if "%yourName%"=="" (
    echo * You must supply a name! *
    echo(
    goto :getName
)
exit /b

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