実際には2つのエラー。まあ - おそらく3つ。
確かにELSE
と の間にスペースがありません(
それから奇妙な綴りがありますarithmetic
-これは重要です. DOS はスペルミスを処理できません。
まあ、実際には、スペースの後に固定された単純なバッチを試しました。そして墜落した。本当にやった!とりあえず、it crashed
正確でした。まあ-CMDは実際にはクラッシュしませんでした。プロンプトに戻っただけです。エラーメッセージはありません - 何もありません。プロンプトが再び表示されました。
set /p
そのため、.の後のスペースを削除して「修正」しました=
。次回はプロンプトが陽気に表示され、すべてがスムーズに実行されたため、これで問題が解決したように見えました。
そこで、jeb
さんの指摘を修正することにしました。確かに - のような式を入力し(3*3)+42
てから間違った結果を入力すると、醜い異議が返されます。
この最後の動作の理由は、ステートメントが解析 (デコードおよび検証) されるためです。すべての %var% は解析時の値に置き換えられます。THENステートメントが実行されます。
結果として、入力した場合(3*3)+42
and 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
最初と 2 番目の解決策は、コマンドの分析能力を使用します(プロンプトからFOR /F
参照してください)。であり、パーサーはそれまでに式を検証済みです。FOR /?
metavariable
3 番目の解決策は"escape"
、キャレット ( ^
)を先頭に付けて閉じ括弧を使用することSET /?
です。ドキュメントについては、 を参照してください。文字がエスケープされると、バッチ言語内でのその特別な意味は無視され、他の文字と同じになります。この場合、キャレット自体が特別な意味を持つ特殊文字であるため、それ自体をキャレットでエスケープする必要があります...
しかし、奇妙なことに、=
再挿入の後にスペースを入れてプログラムを再実行すると、問題なく実行されました。変...