批处理set /p 给我玩死了
1.bat:::===========================================@echooffifexist1.batcall:cont:cont...
1.bat:
::===========================================
@echo off
if exist 1.bat call :cont
:cont
set /p input= q:退出 回车:继续 , 请选择:
if "%input%" == "q" (goto quitt)
:quitt
echo 退出 & pause>nul
exit
goto :eof
echo 继续运行 & pause>nul
::===========================================
此代码保存为1.bat后为什么不可以运行,或者说运行不正常?
输入q,看似正常,但输入其他,则也会执行quitt里面的?
另外,请问 goto :eof 有什么用
我加上后,发现 程序执行了两遍
代码是手敲的,您说的 input=后面不加空格,我测试代码里去掉空格,但是发到这里是手敲的,又习惯加上了,可没空格还是有问题 展开
::===========================================
@echo off
if exist 1.bat call :cont
:cont
set /p input= q:退出 回车:继续 , 请选择:
if "%input%" == "q" (goto quitt)
:quitt
echo 退出 & pause>nul
exit
goto :eof
echo 继续运行 & pause>nul
::===========================================
此代码保存为1.bat后为什么不可以运行,或者说运行不正常?
输入q,看似正常,但输入其他,则也会执行quitt里面的?
另外,请问 goto :eof 有什么用
我加上后,发现 程序执行了两遍
代码是手敲的,您说的 input=后面不加空格,我测试代码里去掉空格,但是发到这里是手敲的,又习惯加上了,可没空格还是有问题 展开
3个回答
展开全部
问题不在于 input 后面有没有空格。。。就算有空格,语句也是正常的。。set /p 是以用户输入的内容为值,= 后面写入的内容,是提示内容,只有用户在控制台输入的内容才是变量的值
这个bat,错就错在不理解批处理的执行过程。。。。语法没错,但就是没有理解到批处理是怎么样执行的。。。
@echo off
if exist 1.bat call :cont 如果存在 1.bat 这个文件,就调用 cont 这个子程序。。。。但是,错就错在 comt 放置的位置不对
CMD 执行了 if 后,存在 1.bat 文件,就调用 cont 这个子程序。。。貌似没错。。。但是,如果不存在 1.bat 文件呢?这条if 就不成立,也就不会调用 cont 程序了
但是,CMD继续执行下面语句:
:cont
set /p input= q:退出 回车:继续 , 请选择:
if "%input%" == "q" (goto quitt)
cont,在这里,会被CMD执行,所以,不管你上面那条 if exist 1.bat 是否成立,都会被执行 cont 子程序,而且,当存在 1.bat时,cont 会被执行两次
而 if 判断用户输入,下面的程序,又放错位置。。。当输入 q 时,if 成立,程序退出。。。。。而当输入非q时,if不成立。。。依然会执行下面的 quitt 子程序
:quitt
echo 退出 & pause>nul
exit
goto :eof goto 在这里,多余的。。上面都exit退出了,何必多此一举??
echo 继续运行 & pause>nul
子程序,都必须放在主程序的最后面。。。而且,每个子程序,都必须使用 goto :eof 来将控制权交还给主程序。。。
@echo off
if exist 1.bat call :cont
echo 继续运行 & pause>nul
exit
::上面这个是主程序
:cont
set /p input= q:退出 回车:继续 , 请选择:
if "%input%" == "q" (goto quitt)
goto cont
::添加一个跳转,当输入不是q时,依然返回重新输入
:quitt
echo 退出 & pause>nul
exit
这个bat,错就错在不理解批处理的执行过程。。。。语法没错,但就是没有理解到批处理是怎么样执行的。。。
@echo off
if exist 1.bat call :cont 如果存在 1.bat 这个文件,就调用 cont 这个子程序。。。。但是,错就错在 comt 放置的位置不对
CMD 执行了 if 后,存在 1.bat 文件,就调用 cont 这个子程序。。。貌似没错。。。但是,如果不存在 1.bat 文件呢?这条if 就不成立,也就不会调用 cont 程序了
但是,CMD继续执行下面语句:
:cont
set /p input= q:退出 回车:继续 , 请选择:
if "%input%" == "q" (goto quitt)
cont,在这里,会被CMD执行,所以,不管你上面那条 if exist 1.bat 是否成立,都会被执行 cont 子程序,而且,当存在 1.bat时,cont 会被执行两次
而 if 判断用户输入,下面的程序,又放错位置。。。当输入 q 时,if 成立,程序退出。。。。。而当输入非q时,if不成立。。。依然会执行下面的 quitt 子程序
:quitt
echo 退出 & pause>nul
exit
goto :eof goto 在这里,多余的。。上面都exit退出了,何必多此一举??
echo 继续运行 & pause>nul
子程序,都必须放在主程序的最后面。。。而且,每个子程序,都必须使用 goto :eof 来将控制权交还给主程序。。。
@echo off
if exist 1.bat call :cont
echo 继续运行 & pause>nul
exit
::上面这个是主程序
:cont
set /p input= q:退出 回车:继续 , 请选择:
if "%input%" == "q" (goto quitt)
goto cont
::添加一个跳转,当输入不是q时,依然返回重新输入
:quitt
echo 退出 & pause>nul
exit
展开全部
不是代码错误,只是你没理解到标签的用法:
在你的代码中如果输入其他代码,打个比方输入了m,那么if语句没判断到满足的条件,所以跳过if继续执行,由于再也没有跳转,而且下一跳语句是一个标签,它执行了标签。这里标签并不是一个程序块,而是正常的语句。所以不管你输入了什么,他都会执行到这个标签。
正确的做法是在if语句后面加一条跳转语句goto :eof,意思就是跳转到结尾。
::══代══码══开══始═══
@echo off
if exist 1.bat call :cont
:cont
set /p input=q:退出; 回车:继续; 请选择:
if "%input%" == "q" (goto quitt)
goto :end
:quitt
cls&echo 退出 & pause>nul
exit
goto :end
:end
cls&echo 继续运行 & pause>nul
::Coded By escortmnm from VBS团队
::══代══码══结══束═══
按照你的意思,我修改了一下,你看看是不是这个效果。
在你的代码中如果输入其他代码,打个比方输入了m,那么if语句没判断到满足的条件,所以跳过if继续执行,由于再也没有跳转,而且下一跳语句是一个标签,它执行了标签。这里标签并不是一个程序块,而是正常的语句。所以不管你输入了什么,他都会执行到这个标签。
正确的做法是在if语句后面加一条跳转语句goto :eof,意思就是跳转到结尾。
::══代══码══开══始═══
@echo off
if exist 1.bat call :cont
:cont
set /p input=q:退出; 回车:继续; 请选择:
if "%input%" == "q" (goto quitt)
goto :end
:quitt
cls&echo 退出 & pause>nul
exit
goto :end
:end
cls&echo 继续运行 & pause>nul
::Coded By escortmnm from VBS团队
::══代══码══结══束═══
按照你的意思,我修改了一下,你看看是不是这个效果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只有if,没有else ,那它当然无论如何都要走下去。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询