2009-11-06 3 views
10

set이 배치 파일에서 작동하지 않는 문제가있었습니다. 문제를 해결하는 데는 시간이 걸렸다. 처음에 나는DOS 배치 : SET 변수와 에코 (...) 블록 내

내가

a = "aaa" 
b = "bbb" 

이유를 기대할 수있는 반면

@echo off 
setlocal 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "%b%" 
) 

출력을

a = "aaa" 
b = "" 

을 생산하는 스크립트 ... 그것은 서브 루틴 호출을 할 줄 알았는데 제발요? 도스의 버그입니까? 아마도 깨닫지 못한 (...) 명령 그룹 구문에 관한 것이있을 것입니다.

감사합니다.

답변

10

지연된 사용자 확장! % 012 대신에 대신

@echo off 
setlocal enableextensions enabledelayedexpansion 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "!b!" 
) 
+0

간결한 답장을 보내 주셔서 감사합니다. 번호가 매겨진 매개 변수 % 1 등의 구문이 있는지 알고 있습니까? 나는 시도했다! 1과! 1!하지만 이것들은 작동하지 않는다. (나는 서브 루틴 호출의 맥락에서 이것을 묻고있다.) – Rhubbarb

+1

% a % 유형 변수가 구문 분석과 실행 사이에서 바꿀 수 없으므로, 그 것이 중요하다는 것을 알지 못한다. –

+0

당신이 맞습니다. 스크립트에 다른 문제가있어서 같은 증상이 나타났습니다. 문제 해결됨. 대단히 고마워. (모두에게). – Rhubbarb

6

지연 확장이 켜져 있어야합니다. 그렇지 않으면 일괄 처리 인터프리터가 런타임 대신 구문 분석시 모든 변수를 보간합니다.

setlocal enableextensions enabledelayedexpansion 

예와 그 중대한 설명을 보려면 this question을 참조하십시오.

7

일괄 처리 인터프리터는 대괄호 사이의 모든 내용을 한 줄로 처리합니다. 즉, 명령을 실행하기 전에 대괄호 사이의 모든 변수를 바꾸는 것입니다.

그래서 :

(
set b=bbb 
echo b = "%b%" 
) 

이된다 : 당신이 SET 명령을 실행하기 전에

(
set b=bbb 
echo b = "" 
) 

변수 B가 설정되지 분명히 설정되어 있지만되고있다.

관련 문제