两个错误,其实。好吧ee,也许。
当然,ELSE
和(
之间缺失的空间,然后还有的arithmetic
奇怪的拼写 - 这是至关重要的。 DOS无法处理拼写错误。
那么,在现实中,我试着简单地使用space-after-else修复这个批处理。它坠毁了。它真的做到了!一次,it crashed
是准确的。嗯 - CMD没有实际上崩溃,它只是返回到提示。没有错误信息 - 没有。再次弹出提示。
所以我通过删除=
后的空格来“固定”set /p
。这似乎解决了这个问题,因为下一次愉快地出现提示,然后一切顺利。
所以我决定修复jeb
的观点。当然 - 输入像(3*3)+42
这样的表达式,然后得到一个不正确的结果,并且您会收到一个难看的异议。
这最后一个行为的原因是语句是PARSED(解码和验证)任何%var%被它在PARSED时的值替换。 然后该声明被执行。
结果,如果我进入(3*3)+42
和56
,原始表达式会被解析为
IF 56 == 51 (ECHO Your...right!) ELSE (ECHO Your...wrong!&ECHO (3*3)+42 = 51)
现在这个[批量,你可以通过用&
分离级联命令]验证失败,因为对于解析器来说ELSE
表达式在闭合括号之后结束3*3
种
@ECHO OFF
setlocal
SET /p exp="Enter Arithmetic Expression:"
SET /p ans1="Enter Expression's Product:"
REM calculating the arithmetic expression:
SET /a ans2= %exp%
::
:: Way the first
::
FOR /f "delims=" %%i IN ("%exp%") DO (
IF %ans1% == %ans2% (
ECHO Your answer is right!
) ELSE (
ECHO Your answer is wrong!
ECHO %%i = %ans2%
)
)
::
:: Way the second
::
FOR /f "tokens=1*delims==" %%i IN ('set exp') DO (
IF %ans1% == %ans2% (
ECHO Your answer is right!
) ELSE (
ECHO Your answer is wrong!
ECHO %%j = %ans2%
)
)
::
:: Way the third
::
SET refexp=%exp:)=^^)%
IF %ans1% == %ans2% (
ECHO Your answer is right!
) ELSE (
ECHO Your answer is wrong!
ECHO %refexp% = %ans2%
)
ECHO Note: 'SET exp' returns
SET exp
的第一和第二溶液使用FOR /F
命令的分析能力(见FOR /?
从提示。)这里的关键是,如果表达可被诱导到metavariable
(循环控制变量),那么它可以直到运行时才会被评估,并且解析器已经验证了表达式。
第三种解决方案是在"escape"
之前加上一个加号(^
)作为前缀(见SET /?
)。当一个字符被转义时,它在批处理语言中的特殊含义被忽略,并且就像任何其他字符一样。在这种情况下,由于插入符号本身是一个特殊含义的特殊字符,它本身需要被插入符号...
但奇怪的是,当我重新运行程序后=
重新插入,它愉快地跑。奇怪...
你从cmd.exe得到一个描述性的错误信息,'ELSE('不起作用,'IF /?'的帮助显示正确的语法 – jeb 2013-03-23 08:15:57
Btw。下一个不太明显的标志当exp包含括号时,出现在'ECHO%exp%=%ans2%'中 – jeb 2013-03-23 08:17:24