2013-03-23 71 views
0

我刚开始在Windows上我的第一个批处理文件的工作,和我不能打通这部分:在批处理文件中如何正确使用算术和if语句?

SET /p exp= "Enter Arthimetic Expression:" 
SET /p ans1= "Enter Expression's Product:" 
REM calculating the arthimetic expression: 
SET /a ans2= %exp% 
IF %ans1% == %ans2% (
ECHO Your answer is right! 
) ELSE(
ECHO Your answer is wrong! 
ECHO %exp% = %ans2% 
) 

这个脚本只是不会工作*,我真不知道哪来的问题.. (但我估计它涉及到IF和ELSE)

*它只是崩溃

+0

你从cmd.exe得到一个描述性的错误信息,'ELSE('不起作用,'IF /?'的帮助显示正确的语法 – jeb 2013-03-23 08:15:57

+0

Btw。下一个不太明显的标志当exp包含括号时,出现在'ECHO%exp%=%ans2%'中 – jeb 2013-03-23 08:17:24

回答

0

两个错误,其实。好吧ee,也许。

当然,ELSE(

之间缺失的空间,然后还有的arithmetic奇怪的拼写 - 这是至关重要的。 DOS无法处理拼写错误。

那么,在现实中,我试着简单地使用space-after-else修复这个批处理。它坠毁了。它真的做到了!一次,it crashed是准确的。嗯 - CMD没有实际上崩溃,它只是返回到提示。没有错误信息 - 没有。再次弹出提示。

所以我通过删除=后的空格来“固定”set /p。这似乎解决了这个问题,因为下一次愉快地出现提示,然后一切顺利。

所以我决定修复jeb的观点。当然 - 输入像(3*3)+42这样的表达式,然后得到一个不正确的结果,并且您会收到一个难看的异议。

这最后一个行为的原因是语句是PARSED(解码和验证)任何%var%被它在PARSED时的值替换。 然后该声明被执行。

结果,如果我进入(3*3)+4256,原始表达式会被解析为

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 /?)。当一个字符被转义时,它在批处理语言中的特殊含义被忽略,并且就像任何其他字符一样。在这种情况下,由于插入符号本身是一个特殊含义的特殊字符,它本身需要被插入符号...

但奇怪的是,当我重新运行程序后=重新插入,它愉快地跑。奇怪...

1

唯一的错误,我能找到,是一个缺少空间之间ELSE和(