작동하지 않는 경우 내부 Windows 일괄 설정


102

이 스크립트를 실행할 때 (.bat 파일에서) :

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

나는 항상 얻는다 :

ECHO is on.

var2변수가 실제로 설정되지 않았 음을 의미합니다 . 누구든지 이유를 이해하도록 도와 주시겠습니까?

답변:


184

var2가 설정되었지만 echo %var2%블록이 실행되기 전에 줄 확장이 발생합니다.
현재 var2비어 있습니다.

따라서 delayedExpansion 구문이 존재하고 !대신 사용하며 %구문 분석 시간이 아닌 실행 시간에 평가됩니다.

을 (를) 사용 !하려면 추가 설명 setlocal EnableDelayedExpansion이 필요합니다.

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

11
당신이 내게 큰 고통을 안겨 주셔서 감사합니다.
Myna 2013 년

&&&연산자에 대한 동일한 규칙 입니다. 이 코드를 set x=some & set y=%x%thing & echo results %y%출력한다 %x%thing.
gwarah

13

나는 파티에 조금 늦었지만이 조건을 처리하는 또 다른 방법은 if이와 같이 외부 에서 프로세스를 계속하는 것입니다.

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

또는 goto구문 사용

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

이렇게하면 확장이 "제 시간에"발생하며 setlocal EnableDelayedExpansion. 결론적으로, 스크립트 디자인을 다시 생각한다면 그렇게 할 수 있습니다.


if 문에서 만든 변수에 액세스 할 수 없습니다. var2를 사용한 첫 번째 예제가 작동하지 않습니다.
AntonioCS

@AntonioCS 흥미로운 ... 이것은 내가 방금 테스트 한 정확한 스크립트 echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. 작동하고 있습니다. "프로그램의 어느 곳에서나 액세스 할 수있는 배치 파일에 변수를 만들 경우." . aticleworld.com/batch-file-variables-and-scope
TS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.