2014-07-07 3 views
0

배치 프로그램에서 연습 중이므로 하나의 루프 및 산술 명령어를 작성하려고합니다. 다음 코드를 작성했습니다 :결과가 아닌 산술 식

@echo off 
SET /a i=1 
FOR /F %%A IN ('DIR /B') DO (
    SET /a i += %i% + %i% + 4 
    ECHO %i%) 

그러나 각 줄의 대답은 1입니다!
이 코드를 SET /a "i += %i% + %i% + 4"과 함께 쓰려고했지만 대답은 동일했습니다. herehere 을 확인했지만이 오류와 관련이 없습니다.
심지어 내가 언급 한 줄에서 둘러싸인 공백을 제거했지만 대답은 동일했습니다.

답변

1

set /a i=1set /a i = 1과 같지 않습니다. 두 번째 경우에는 이름에 공백이있는 변수를 정의합니다.

산술 스위치를 사용하지 않고 set i= 1을 사용하는 경우 = 다음의 공백이 변수 값에 포함됩니다.

그러나 코드 블록 (괄호 내부 코드) 구문 분석 할 때이 수정으로 문제가

@echo off 
    setlocal enabledelayedexpansion 

    SET /a "i=1" 
    FOR /F %%A IN ('DIR /B') DO (
     SET /a "i+=i+i+4" 
     ECHO !i! 
    ) 

    endlocal 

다른입니다

모든 변수는 실행하기 시작 전에 변수 의 값으로 대체됩니다 읽기 그 블록. 따라서 코드 블록 내에 %i%을 사용하면이 변수 읽기가 실행되기 전에 변수 값으로 대체 되었기 때문에 콘솔에 반영된 변경 값은 보이지 않지만 초기 값은 1입니다. 변수가 값을 변경하면 (set이 실행 됨) echo 명령이 변수에 액세스하지 않고 루프 시작 전에 해당 값을 사용하므로 모든 반복에 대해 동일한 값이 반복됩니다.

가변 코드 변경된 값의 블록 내부에 변경되는 경우는, 지연 팽창이 활성화 될 필요가 있고 !i!%i%에서 필요한 변수 액세스 변화 구문 나타내는데 동일한 코드 블록 내부에 접근 할 필요 변수 값에 대한 액세스가 명령 실행까지 지연되어야한다는 파서.

+0

감사합니다. 죄송합니다. 설정란은 무엇입니까? – bahrami307

+0

@ bahrami307 일 경우 배치 파일의 변경 사항으로부터 환경을 보호하는 명령입니다. 'setlocal' 이후에 변경되거나 변경된 값은'endlocal' 후에 버려집니다. 지연된 확장 ('setlocal enabledelayedexpansion')을 가능하게하거나'cmd/v : on/c "myFile.cmd"'로'cmd' 인스턴스를 시작하여 배치 확장 파일이 실행되도록 보장 할 수 있습니다 . –

+0

감사합니다. – bahrami307

관련 문제