2013-03-23 65 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和(

相關問題