可以通过 GOTO 传递变量还是可以 CALL 但结束时不返回?

问题描述 投票:0回答:3

假设您有一个像这样的批处理文件:

@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

我想验证输入,并且能够在每一步中中止该过程。它运作良好;直到有人搞砸并触发验证。我尝试 goto :label err1 但 GOTO 不允许传递参数。所以我改用CALL。问题是 1 它似乎保留了 %1 ,因为在我尝试输入空白名称后它会大声叫我输入名称。我这样做了,然后在下一个屏幕上它立即大喊我必须输入年龄,尽管我还没有机会。第二个问题是,如果我尝试终止, goto :eof 只是关闭 CALL 循环并将我发送回 CALL 发起的位置并继续。

处理这个问题的正确方法是什么?谢谢!

batch-file
3个回答
1
投票

从字面上理解你的问题标题:

  1. 可以通过 GOTO 传递变量吗?
    不,您不能通过
    goto :label
    使用变量传递数据。
  2. 可以打电话但结束后不返回吗?
    不,被调用子程序中的
    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
投票

您可以稍微改变一下流程。
并且您应该删除稍后使用 set /p 使用的任何变量,因为当用户仅按 Enter 时 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
...

0
投票

您可以设置一个变量并继续在不同的部分中使用它。这样你就“有点”将变量传递给 GOTO:

echo start
set foo=baa
GOTO part1

:part1
echo %foo%
GOTO end

顺序并不重要,只要在使用前先安装

foo
即可。

© www.soinside.com 2019 - 2024. All rights reserved.