2012-07-28 3 views
0

여기에 일괄 처리가 있습니다. 상위 디렉토리를 고수하려고합니다.루틴의 변수 덮어 쓰기

@echo off 

SET CWD= 

:process 
if [%1] == [] goto end 
SET MASTER_DIR="%~f1" 

rem Change to say, E:\DVD_LIBRARY\Rips 
cd /d %MASTER_DIR% 
for /R %%D IN (\) DO (

    rem Temporarily change to the subdir, such as E:\DVD_LIBRARY\Rips\SIN_CITY\ 
    pushd %%D 
    for /F "usebackq" %%Z in (`dir /b *.vob 2^>NUL`) DO (
     if exist %%~fZ (

      rem Get this parent directory to store the log file in (eventually) 
      CALL :resolve "%%D\.." CWD 

      rem Nada. 
      echo: %CWD% 
     ) 
    ) 
    popd 
) 
shift 
goto process 

:resolve 
SET %2=%~f1 
goto :EOF 

:resolve 루틴에서 나는 원하는 값을 얻고 있습니다. 이 블록으로 돌아 가기 :

if exist %%~fZ (
    CALL :resolve "%%D\.." CWD 
    echo: %CWD% 
) 

나는 아무것도 얻지 못합니다.

이것이 왜 고집하지 않는 이유 또는 더 좋은 방법일까요? 나는 구글을 샅샅이 뒤졌으며이 기술과 다른 몇몇 기술자가 여기에 있다는 것을 알았지 만, 왜 CALL 값이 번역되지 않는지 모르겠습니다.

답변

2

변수는 설정되지 않았지만 시도한 방식대로 반향 할 수는 없습니다. IF 블록을 파싱 할 때 확장 되었기 때문입니다.

하지만 CALL 후에 확장해야합니다. 당신은 지연 확장 또는

if exist %%~fZ (
    CALL :resolve "%%D\.." CWD 
    call echo: %%CWD%% 
) 

또는

setlocal EnableDelayedExpansion 
if exist %%~fZ (
    CALL :resolve "%%D\.." CWD 
    echo: !CWD! 
) 
+0

아름다운 CALL-확장으로 해결 할 수있다. 그런 이상한 언어 .... 고마워! – Phix