0

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が関係していると推定されます)

*クラッシュするだけ

4

2 に答える 2

1

私が見つけることができる唯一のエラーは、ELSEと(

于 2013-03-23T07:53:32.703 に答える
0

実際には2つのエラー。まあ - おそらく3つ。

確かにELSEと の間にスペースがありません(

それから奇妙な綴りがありますarithmetic-これは重要です. DOS はスペルミスを処理できません。

まあ、実際には、スペースの後に固定された単純なバッチを試しました。そして墜落した。本当にやった!とりあえず、it crashed正確でした。まあ-CMDは実際にはクラッシュしませんでした。プロンプトに戻っただけです。エラーメッセージはありません - 何もありません。プロンプトが再び表示されました。

set /pそのため、.の後のスペースを削除して「修正」しました=。次回はプロンプトが陽気に表示され、すべてがスムーズに実行されたため、これで問題が解決したように見えました。

そこで、jebさんの指摘を修正することにしました。確かに - のような式を入力し(3*3)+42てから間違った結果を入力すると、醜い異議が返されます。

この最後の動作の理由は、ステートメントが解析 (デコードおよび検証) されるためです。すべての %var% は解析時の値に置き換えられます。THENステートメントが実行されます。

結果として、入力した場合(3*3)+42and 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 /?です。ドキュメントについては、 を参照してください。文字がエスケープされると、バッチ言語内でのその特別な意味は無視され、他の文字と同じになります。この場合、キャレット自体が特別な意味を持つ特殊文字であるため、それ自体をキャレットでエスケープする必要があります...

しかし、奇妙なことに、=再挿入の後にスペースを入れてプログラムを再実行すると、問題なく実行されました。変...

于 2013-03-23T09:25:32.427 に答える