If statement 批处理文件在if语句处不断崩溃

If statement 批处理文件在if语句处不断崩溃,if-statement,batch-file,cmd,goto,If Statement,Batch File,Cmd,Goto,我正在做一个简单的文字游戏。在到达if语句之前,一切正常。我不知道我做错了什么 @echo off title Text Adventures echo "What is your name?" set /p name= echo "That was a bad crash. Are you hurt, %name%?" echo. echo Y/N set /p answer= if %answer% equ y goto hurt :

我正在做一个简单的文字游戏。在到达if语句之前,一切正常。我不知道我做错了什么

@echo off

title Text Adventures

echo "What is your name?"

set /p name=

echo "That was a bad crash. Are you hurt, %name%?"

echo.

echo Y/N

set /p answer=

if %answer% equ y goto hurt

:hurt

echo.

echo "I see. That's a gnarly gash you've got there!"

在这里,我重新编写了这篇文章,以一种使用函数的形式,并使用我提供给原始帖子的建议作为评论

你知道我错误地认为你使用标签是有目的的,但考虑到问题给出的方式,我认为你最好不要麻烦他们

以下是无标签版本:

@(SETLOCAL)
回音
标题文本冒险
)
电话:Main
(完)
回声,剧本结束了!
暂停
退出/B
)
:Main
set/p“name=你叫什么名字?”
回声。
选择/M“那是一次严重的撞车。你受伤了吗,%name%?”
如果%ERRORLEVEL%equ 1(
回声。
echo“我明白了,你的伤口很粗糙!”
)否则(
回声。
回声:“哦,太好了!”
)
暂停
后藤:EOF
这是标签的版本。(我删除了解释它是如何工作的以及为什么代码在那里的注释,这样对您来说就不会太混乱了。)

@(SETLOCAL)
回音
标题文本冒险
)
电话:Main
(完)
回声,剧本结束了!
暂停
退出/B
)
:Main
set/p“name=你叫什么名字?”
回声。
选择/M“那是一次严重的撞车。你受伤了吗,%name%?”
如果%ERRORLEVEL%equ 1(
电话:伤害
)否则(
电话:诺瑟特
)
暂停
后藤:EOF
:受伤
回声。
echo“我明白了,你的伤口很粗糙!”
后藤:EOF
:诺瑟特
回声。
回声:“哦,太好了!”
后藤:EOF

对于这类事情,我更喜欢使用choice,并经常使用menu宏,将所选选项作为字符串返回变量
option

下面是一个shell脚本,它演示了我经常使用的几个宏的用法

@ECHO Off&Goto:main
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::*函数*::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:+------------------------------------------------------------------------------------------------+:
:彩色字符串
(对于%%C in(%~1)请设置“rv=!rv!%/E%!#A!m%~C%/E%0m”&设置/A“#A+=1”&如果“!#A!”==“37”(设置#A=31))
退出/b0
:+------------------------------------------------------------------------------------------------+:
:颜色菜单
rem集合/A“RR=!random!%%195+60”,“GG=!random!%%195+60”,“BB=!random!%%195+60”
rem集合“%~1=%/E%38;2;!RR!;!GG!;!BB!m!%~1!%/E%0m”
设置“rV=”&如果“!#A!”=”(设置#A=32)
(对于%%C in(“!%~1!”)请设置“rv=!rv!%/E%!#A!m%~C%/E%0m”&设置/A“#A+=1”&如果“!#A!”=“37”(设置#A=31))&设置“%~1=!rv!”
退出/b0
:+------------------------------------------------------------------------------------------------+:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:main*环境定义*::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Rem/*确保宏定义的环境正确*/
Endlocal和Setlocal DISABLEdelayedexpansion
:+------------------------------------------------------------------------------------------------+:
对于('echo prompt$E^ | cmd')中的/F%%a,执行(设置)/E=%%a[”)
:+------------------------------------------------------------------------------------------------+:
设置“ChoList=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”
设置“colleters=Set”Rv=“&Set”#A=31”和(对于%%A in($Str)设置“Word=%%~A”&对于%%B in(0 1 2 3 4 5 6 7 8 A B c d e f g h i j k l m n o p q r s t u v w x y z.+-\u[]/\”)设置“Word=!Word:%%~B=%%~B!”&(调用:ColorString”!Word Echo/!Rv
为%%G in(“!MSG!”)Do(为%%v in(%%~G)Do(为%%v in(%%~G)Do(为%%x in(!Rv!))Do(为%%x in(!Rv!)Do(为%%v=“&Call:Colorstring”%%~v”)设置“ColWORD/S=Set”&MSG=$Str
设置“List/D/V=Set”#$L=0”和设置“$$L=”&如果%%n==2(对于%%G in(!$L!),设置%%G”>Nul&Set/A“#$L+=1”),则设置%%L=”
设置“Menu=For%%n in(1 2)Do if%%n==2(!DIV!)设置“CH#=0”和设置“CHCS=”For%%G in(!Options!)Do For%%i in(!CH#!)Do(设置“CHCS=!CHCS!!ChoList:~%i,1!”&设置“Opt[!ChoList:~%i,1!]”=%G”&设置“Opt=%G”&调用:彩色菜单Opt&我忘记添加暂停

@echo off

title Text Adventures

echo "What is your name?"

set /p name=

echo "That was a bad crash. Are you hurt, %name%?"

echo.

echo Y/N

set /p answer=

if %answer% equ y goto hurt

:hurt

echo.

echo "I see. That's a gnarly gash you've got there!"

pause

通过使用
IF/I
开关,您只能使用
eq
和其他字符串比较。您应该修改
SET/P
命令来询问用户的问题,因为
SET/P
允许向用户显示此表单
SET/P”变量=测试,因此不需要单独的回显"
同样地,我会使用
选择
而不是
设置/P
来进行选择,因为它可以简单地快速选择一个字母的回答
选择/?
给出了一些示例。我需要了解更多。但是我确信它工作得很好。我会检查它。为什么你只使用一次的函数?@SomethingDark对于OP来说,这是一个更好的问题。OP只是给出了一个片段,如果他只需要写那些行,那么他使用的
GOTO
s来访问的子函数似乎完全没有必要,除非他计划以后用它们做更多的事情。我只是给他一个好处,怀疑他是否真的想在那里做更复杂的事情并建议他调用函数,而不是调用函数。@JosephZamora
所以…不刻薄,但你的答案很糟糕。我又看了一遍,只是忘了在最后加上停顿。你把事情弄得太复杂了。–Joseph Zamora昨天,如果你不刻薄的话,你很容易就得了ph我觉得你的评论不那么刻薄。事实上,我很惊讶,也有点受伤,因为你对帮助你的真正努力缺乏感激。至于你对我的帮助的看法,好吧,有些人不能告诉好朋友