在goto命令之后BATCH程序崩溃

时间:2015-08-21 02:08:01

标签: batch-file

此代码是我目前正在处理的聊天程序的一部分。我的程序中的“ else ”部分是不起作用的部分。程序退出而不是转到:home

:join
cls
if not exist "C:/Users/Public/room.cmd" (
echo No room has been found.
echo.
set /p choiceretry=Do you want to retry? y/n 
if "%choiceretry%"=="y" goto join
if "%choiceretry%"=="n" goto home
) else (
cls
"C:/Users/Public/room.cmd"
echo A room has been found. 
pause >nul
echo Joining
set roomjoined=1
echo %roomjoined%
goto home
)

:home
echo this finally works
pause

我尝试从'echo Joining'

开始多次更改代码

任何人都知道为什么cmd会退出?... :) :) :) :) 提前致谢

2 个答案:

答案 0 :(得分:0)

首先,请不要左对齐你的代码块。阅读正确缩进的代码要容易得多。

其次,在代码块中检索值时,需要延迟扩展。有关详细信息,请参阅cmd提示中的setlocal /?这是意外行为的原因。您在设置它们的同一个括号代码块中检索的变量不会包含您期望的值,除非您使用延迟扩展语法检索它们。作为替代方案,您可以使用choice命令和if errorlevel,这样可以带来更好的用户体验。

第三,在测试用户输入时,您应该使用/i语句中的if开关来区分大小写。如果使用choice / if errorlevel,这并不相关。

第四,Windows路径使用反斜杠,而不是正斜杠。

我以这种方式修复它:

@echo off
setlocal

:join
cls
if errorlevel 1 set /P "=Retrying... "<NUL
if not exist "C:\Users\Public\room.cmd" (
    echo No room has been found.
    echo.
    choice /c yn /n /m "Do you want to retry? [y/n] "
    if errorlevel 2 goto home
    goto join
) else (
    "C:\Users\Public\room.cmd"
    echo A room has been found. 
    pause >nul
    echo Joining
    set roomjoined=1
)

:home
echo this finally works
pause

答案 1 :(得分:0)

问题在于你运行room.cmd的方式;你必须使用call从中返回:

call "C:/Users/Public/room.cmd"

否则,执行不会从room.cmd返回到运行它的原始批处理文件。

提示:对于 Y / N 决定,请考虑使用choice代替set /P