배치 파일. 변수 속의 변수

배치 파일. 변수 속의 변수

변수에서 변수를 사용하는 방법은 무엇입니까? 이 코드는:

set newvar=%var%var2%%

작동하지 않습니다. 그래서 뭐 할까? 그것 없이는 프로그램을 작성할 수 없습니다.

답변1

나는 AFH에 동의합니다. 명령문을 "이중 구문 분석"하려면 CMD를 사용해야 합니다 set. 하지만 임시 배치 파일을 포함하지 않는(또는 원하는 변수를 찾기 위해 모든 변수를 살펴보는 것) 이 작업을 수행하는 데 문제가 있다는 것을 발견했습니다. 이는 서브루틴과 지연된 변수 확장이라는 트릭을 사용합니다. 추가하여 지연된 확장 활성화

setlocal enabledelayedexpansion

배치 파일 시작 부분 근처 어딘가에 있습니다. 지연된 변수 확장의 목적은 다소 복잡합니다( 자세한 내용은 SET /?SETLOCAL /?참조). 그러나 알아야 할 중요한 점은 를 사용하여 변수를 참조할 수 있다는 것 입니다 .!variable_name!%variable_name%

자, 여기 있습니다:

@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof

:kludge
set newvar=!%1!
exit /b

으로 점프하면 :kludge명령문은 먼저 set newvar=!var2! (왜냐하면  %1서브루틴의 첫 번째 인수는 이기 때문에 var2)로 변환된 다음 set newvar=orange(문이 이었던 것처럼 set newvar=%var2%)로 변환됩니다. 그래서 newvar으로 설정됩니다 orange.

BTW, goto :eof그리고 exit /b상호 교환이 가능합니다. 서브루틴 내에서 호출되면(즉, 명령문을 사용하여 도착한 곳 call) 호출자에게 반환이 발생합니다. 그렇지 않으면 배치 파일 끝으로 점프하는 것처럼 작동하여 상위 대화형 명령 프롬프트를 없애지 않고 배치 작업이 종료됩니다.

답변2

비교적 느린 방법입니다. CALL 명령은 추가 수준의 변수 확장을 제공합니다. 외부 변수 이름 주위의 백분율은 내부 변수가 확장될 때까지 확장을 지연하기 위해 두 배가 됩니다.

@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"

훨씬 더 좋은 방법은 지연된 확장을 사용하는 것입니다. 먼저 SETLOCAL ENABLEDELAYEDEXPANSION을 사용하여 활성화해야 합니다. 행을 구문 분석할 때 백분율 내의 변수가 확장됩니다. 느낌표 안의 변수는 구문 분석 후 라인이 실행되기 직전에 확장됩니다.

@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"

답변3

일반적으로 나는 이와 같은 시나리오를 피하려고 노력합니다. 가능하기는 하지만 성능이 좋지 않으며 읽기도 쉽지 않습니다. 기본적으로 명령의 출력을 구문 분석해야 합니다 set.

set index=9
set var9=Goal

echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%

관련 정보