2017-05-02 7 views
1

환경 변수 변수 을 지연 확장을 시도하면 : .BAT 파일 IF 문 내에 : 절이 파싱/실행되지 않습니다. ! 대신 % 기호 사용! 확장 작업. 동일한 지연된 확장은 다른 장소, 예를 들어 ECHO에서 작동합니다. 예를 들면 :bat 파일 enabledelayedexpansion이 IF 문에서 확장되지 않습니다.

@echo off& setlocal enabledelayedexpansion 
set t=abcd 
echo !t:~0,2! 
if %t:~0,2% == ab echo equal 
if !t:~0,2! == ab echo equal 

에코 t! ~ 0.2을! 올바르게 생성 : AB

은 %의 경우의 T ~ 0.2 %가 == 시종 동일한 에코가 정확하게 생성 :

동일

경우 t!의 ~ 0.2을! == ab 에코는과 동일합니다. 2! 이 시점에서 예기치 않게 발생했습니다

지연된 확장 을 사용하여 IF 문 내에 : : 절을 사용할 수없는 이유를 모르겠습니다. 콜론 절이 없으면 IF 문 내부의 지연된 확장이 올바르게 작동합니다.

답변

2

지연된 확장 자체가 문제가 아니며, 쉼표가 내부에 있습니다.
배치 파서가 백분율 확장 이후 지연된 확장 표현식을 확장하기 때문입니다.
따라서 IF 파서 !t:~0,2!으로 표시되며 쉼표가 구분 기호로 사용됩니다.

따옴표를 사용하면 쉽게 피할 수 있습니다.
또는 쉼표를 이스케이프합니다. 당신은 SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+0

에서 다른 배치 파서 단계의 순서에 대해 읽을 수 있습니다

if "!t:~0,2!" == "ab" echo equal if !t:~0^,2! == ab echo equal 

그것을 감사 - 나는 경우 문자열 작업 이후 내 문제를 해결하는. 숫자 IF 비교에서 여전히 문제가 될 수 있습니다. 예를 들어 n = 123 & if! n : ~ 1,2! gtr 5 - 문자열 비교를 강제하기 때문에 args를 따옴표로 묶을 수 없습니다. 사전에 세트를 사용하고 지연된 확장을 if 문에서 제거하면이를 수정합니다. –

+1

@PaulH 또한 쉼표로 쉼표를 이스케이프 할 수도 있습니다 – jeb