2013-03-23 2 views
0

난 그냥 창문에 처음으로 배치 파일 작업을 시작했습니다, 그리고 난을 통해이 부분을 얻을 캔트 : 그냥 못해 작업 *배치 파일 내에서 산술과 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% 
) 

이 스크립트와 문제가 어디 난 정말 모르겠어요 .. 이

은 * 그냥 내가 찾을 수 있습니다,

+0

cmd.exe에서 설명하는 오류 메시지가 있는데,'ELSE ('는 작동하지 않습니다.) 그리고'IF /? '의 도움을 받아 정확한 구문 – jeb

+0

Btw가 표시됩니다. exp가 대괄호를 포함하고있을 때'ECHO % exp % = % ans2 %'에 나온다. – jeb

답변

0

두 오류입니다. 음 - 네 아마도.

는 확실히 ELSE(

사이의 누락 된 공간은 다음 arithmetic의 이상한 철자있다 -이 중요하다. DOS는 잘못된 철자를 처리 할 수 ​​없습니다.

글쎄, 현실에서는 배치를 단순히 공간 - 후 - 고정으로 시도했다. 그리고 추락했습니다. 그것은 정말로했다! 한 번은 it crashed이 정확했습니다. 음 - CMD가 실제로 크래시가 이 아니었지만 프롬프트로 돌아 왔습니다. 오류 메시지 없음. 그냥 다시 프롬프트가 나타났습니다.

그래서 = 뒤에 공백을 제거하여 set /p을 "고정"했습니다. 프롬프트가 기분 좋게 다음에 나타나고 모든 것이 순조롭게 진행 되었기 때문에 그 문제를 해결하는 것처럼 보였습니다.

이렇게 나는 jeb의 점을 고치기로 결정했습니다. 확실히 - (3*3)+42과 같은 표현식을 입력 한 다음 잘못된 결과를 입력하면 추악한 이의를 얻습니다.

마지막 동작은 PARSED 일 때 구문이 PARSED (디코딩되고 유효성이 검사 됨) 된 모든 % var %가 해당 값으로 대체된다는 것입니다. THEN 문이 실행됩니다. 결과에서

, 내가 (3*3)+4256 입력 한 경우는, 원래의 표현이

IF 56 == 51 (ECHO Your...right!) ELSE (ECHO Your...wrong!&ECHO (3*3)+42 = 51)

로 분석 될 지금이

[일괄, 당신은 &로 구분하여 명령을 계단식 수 있습니다] 파서는 ELSE 표현식이 닫힌 괄호로 끝나고 3*3

뒤에 끝나는 것으로 간주하므로 유효성 검사에 실패합니다. 15,
@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 /? 참조). 여기서 핵심이며 FOR /F 명령의 분석 능력을 사용 식은 다음 metavariable (루프 제어 변수)에 기른 할 수있는 경우는 수 실행 시간까지 평가 될 것이고 파서는 이미 그때까지 표현을 검증했다.

세 번째 해결 방안은 "escape" 접미사 (^)를 접두어로 붙이면됩니다 (자세한 내용은 SET /? 참조).문자가 이스케이프 처리되면 배치 언어 내에서 특수한 의미가 무시되고 다른 문자와 동일하게됩니다. 이 경우 캐럿은 그 자체로 특별한 의미를 지닌 특수 문자이기 때문에 캐럿으로 도주해야합니다 ...

하지만 이상한 점은 그 이후에 프로그램을 다시 실행했을 때 =을 다시 삽입하면 행복하게 실행됩니다. 이상한 점 ...

1

유일한 오류를 충돌 (하지만 난 그것을 ELSE는 IF와 관련된 추정), 실제로 누락 된 사이 ELSE 공간과 (

관련 문제