假设您有一个像这样的批处理文件:
@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 发起的位置并继续。
处理这个问题的正确方法是什么?谢谢!
从字面上理解你的问题标题:
goto :label
使用变量传递数据。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
您可以稍微改变一下流程。
并且您应该删除稍后使用 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
...
您可以设置一个变量并继续在不同的部分中使用它。这样你就“有点”将变量传递给 GOTO:
echo start
set foo=baa
GOTO part1
:part1
echo %foo%
GOTO end
顺序并不重要,只要在使用前先安装
foo
即可。