2010-03-25 3 views
0

숫자를 파일 경로에 삽입하는 스크립트가 필요합니다 (예 : , C : \ WINDOWS \ system32 \ ansi). sys to C : \ WINDOWS \ system32 \ 5.ansi.sysWindows 루프 스크립트의 함수에서 반환 된 값이 FOR 루프에서 무시됩니다.

레이블을 사용하여 함수를 만들었으며 FOR 루프 내에서 호출 할 때까지 제대로 작동하는 것 같습니다.

이 내가 쓴 코드입니다 :

@ECHO OFF 

SET PATHTOPROCESS="C:\WINDOWS\system32\ansi.sys" 

call :GetNewFilePath NEWPATH %PATHTOPROCESS% 7 
echo New file name: %NEWPATH% 

call :GetNewFilePath NEWPATH %PATHTOPROCESS% 5 
echo New file name: %NEWPATH% 

FOR /L %%i in (1,1,2) DO (
    call :GetNewFilePath NEWPATH %PATHTOPROCESS% %%i 
    echo New file name in FOR loop: %NEWPATH% 
) 

goto :eof 


:GetNewFilePath 
SETLOCAL 
SET PINDEX=%~3 
SET PDIRECTORY=%~dp2 
SET PFILE=%~nx2 
SET LocalVar1=%PDIRECTORY%%PINDEX%.%PFILE% 
ENDLOCAL & IF "%~1" NEQ "" SET %~1=%LocalVar1% 
goto :eof 

는이 내가 얻을 출력 :

New file name: C:\WINDOWS\system32\7.ansi.sys 
New file name: C:\WINDOWS\system32\5.ansi.sys 
New file name in FOR loop: C:\WINDOWS\system32\5.ansi.sys 
New file name in FOR loop: C:\WINDOWS\system32\5.ansi.sys 

이 내가 기대하는 것입니다 :

New file name: C:\WINDOWS\system32\7.ansi.sys 
New file name: C:\WINDOWS\system32\5.ansi.sys 
New file name in FOR loop: C:\WINDOWS\system32\1.ansi.sys 
New file name in FOR loop: C:\WINDOWS\system32\2.ansi.sys 

그것은 것 같다 FOR 루프에서 변수는 함수를 호출하기 전의 값으로 되돌려집니다. FOR를 사용할 때 특별한 트릭이 필요합니까?

감사합니다.

답변

2

내부의for 루프는 해당 블록이 구문 분석 될 때 즉시 확장되며 실행될 때 확장되지 않습니다.

rem this should preferrably go at the very start of the batch file 
setlocal enabladelayedexpansion 

... 

FOR /L %%i in (1,1,2) DO ( 
    call :GetNewFilePath NEWPATH %PATHTOPROCESS% %%i 
    echo New file name in FOR loop: !NEWPATH! 
) 

그렇지 않으면 %NEWPATH%은이 루프 전에 했다 루프 내부의 변수 왼쪽 없을 것 값으로 확장 될 것입니다 : 당신은 지연 확장을 사용해야합니다.

처음에는 echo off을 제거 할 때 쉽게 확인할 수 있습니다. 루프 블록은 확장 된 값을 실행하기 전에 표시합니다. 지연된 확장에 대한 자세한 내용은 help set을 참조하십시오.

+0

그래, 그럴 것 같습니다. :) 고마워, 요하네스. – Paul

관련 문제