如何正确使用批处理文件中的算术和if语句?

时间:2013-03-23 07:24:43

标签: windows if-statement batch-file

我刚刚开始在Windows上创建我的第一个批处理文件,我无法通过这个部分:

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)

*它只是崩溃

2 个答案:

答案 0 :(得分:1)

我能找到的唯一错误是ELSE和(

)之间缺少空格

答案 1 :(得分:0)

实际上有两个错误。好吧 - 也许是三个。

当然ELSE(

之间缺少空格

然后是arithmetic的奇怪拼写 - 这很关键。 DOS无法处理拼写错误。

嗯,实际上我只是简单地用其他方式修复了批处理。它崩溃了。它确实做到了!一次,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 /?以获取文档。当角色被转义时,它在批处理语言中的特殊含义被忽略,它就像任何其他角色一样。在这种情况下,由于插入符本身就是一个具有特殊含义的特殊字符,它本身需要被插入符号转义...

但奇怪的是,当我重新插入=之后用空格重新运行程序时,它运行愉快。奇怪...