2012-06-27 2 views
0

이 사이트 및 다른 항목을 검색했습니다.배치/CMD에서 여러 변수의 이름을 연결

1) 파일

2) 파일에서 데이터를 받아 다른 변수에 저장 데이터를 쓸 것입니다 루프 중첩을 실행하려고

:: first for loop 
for /L %%x in (1,1,2) do (
generic-executable.output > grab1-%%x.txt 

:: second, nested for loop 
for /f "delims=" %%i in (grab1-%%x.txt) do (set grab1=%%i) 
echo variable string is %grab1%%x% 

generic-executable.output > grab2-%%x.txt 
for /f "delims=" %%i in (grab2-%%x.txt) do (set grab2=%%i) 
echo variable string is %grab2%%x% 
) 

.

끝 변수의 이름은 각 for 루프 (예 : grab1-1, 2-1, 1-2, 2-2)의 연결이어야합니다.

변수에 데이터를 저장하는 것은 아무런 문제가되지 않습니다., 데이터를 호출하기위한 변수의 형식은 IS입니다.

나는 연결된 변수의 형식을 지정하는 데있어 가장 가능성이 높습니다. 나는 하나의 '을 두 번 시도했다. ", ^, !, 하나의 %, 두 개의 %, 백 슬래시, ACK! ... 내가 왔 가장 가까운

echo %grab1-%%x 

준이다 :

%grab1-1 

난 당신이 제공 할 수있는 어떤 조언을 감사하겠습니다.

덕분에, 데이브

+0

'% grab1 %% x %'는'% grab1 % '옆에'% x %'을 (를) 의미합니다. 그러나'% x %'은 무엇입니까? 스크립트에 그러한 변수가없는 것 같습니다. '%% x'을 (를) 사용하셨습니까? 그렇다면 표현식은'% grab1 %%% x'이어야합니다. 같은 것은'% grab2 %% x %'에 관한 것입니다. –

+0

@Andriy M - 두 변수 (% grab1 %와 %% x)를 하나로 묶으려는 시도 였기 때문에 이전의 끝 %를 후자의 끝으로 옮겼습니다. – DCT

답변

2

당신은 배치 초보자를위한 고전적인 걸림돌로 실행 한 : 당신은 (괄호 안에) 루프 내에서 변수를 설정 한 다음 같은 루프 내 %var%를 사용하여 값에 액세스 할 수 없습니다. 전체 루프 (괄호 안의 코드 블록)는 한 번에 구문 분석되고 %var%은 구문 분석시 확장됩니다. 따라서 루프가 실행되기 이전의 값인 var이 표시됩니다.

해결 방법은 스크립트 상단에서 setlocal enableDelayedExpansion을 사용하여 지연된 확장을 사용하고 지연 확장을 사용하여 변수를 !var!으로 확장하는 것입니다. 지연된 확장은 런타임에 값이 확장된다는 것을 의미합니다.

나는 이것이 당신이

setlocal enableDelayedExpansion 
for /L %%x in (1,1,2) do (

    genericOutput1.exe > grab1-%%x.txt 
    for /f "delims=" %%i in (grab1-%%x.txt) do set "grab1-%%x=%%i" 
    echo grab1-%%x variable string is !grab1-%%x! 

    genericOutput2.exe > grab2-%%x.txt 
    for /f "delims=" %%i in (grab2-%%x.txt) do set "grab2-%%x=%%i" 
    echo grab2-%%x variable string is !grab2-%%x! 
) 

::List all of the grab variable defined 
set grab 

당신은 파일에 실행 파일의 출력을 저장할 필요가 없습니다를 달성하려고했던 것입니다 생각합니다. (물론 그것이 귀하의 요구 사항이 아니라면). FOR/F를 사용하여 출력을 직접 처리 할 수 ​​있습니다. FOR 명령에는 거의 동일하게 보이지만 매우 다르게 작동하는 많은 변형이 있습니다. 이 변형은 작은 따옴표를 사용하여 FOR/F가 명령을 처리하게합니다.

setlocal enableDelayedExpansion 
for /L %%x in (1,1,2) do (

    for /f "delims=" %%i in ('genericOutput1.exe') do set "grab1-%%x=%%i" 
    echo grab1-%%x variable string is !grab1-%%x! 

    for /f "delims=" %%i in ('genericOutput1.exe') do set "grab2-%%x=%%i" 
    echo grab2-%%x variable string is !grab2-%%x! 
) 

::List all of the grab variable defined 
set grab 

FOR/F는 텍스트 파일이든 명령 출력이든 관계없이 각 줄을 반복합니다. 알고리즘은 마지막 행의 내용 만 저장하고 인쇄합니다. 연속하는 각 행은 이전 행의 값을 덮어 씁니다.

+0

BA-DA-BING !! 코드와 N00b 상태가 여러 번 맞았습니다! IRT는 generic 출력을 캡처합니다. 예, 로컬 요구 사항입니다. 분명히 DelayedExpansion에서 edu-ma-cated를 얻을 필요가 있습니다. – DCT

관련 문제