지연된 확장 및 변수 교체 문제

지연된 확장 및 변수 교체 문제

파일에 대한 파일 경로가 포함된 5개의 정적 설정 변수를 뒤집은 다음 INI대체할 특정 문자열을 읽고 검색하는 이 배치 스크립트가 있습니다.

내 문제는 교체를 수행하고 파일을 디스크에 다시 쓴 후에 INI 파일 내의 모든 인스턴스를 삭제하는 것으로 보이며 !결과적으로 내 프로그램이 중단된다는 것입니다.

!DelayedExpansion으로 인해 표시가 교체되는 것 같지만 여기서 작업을 수행하려면 표시가 필요합니다. 문제가 있는 기능의 사본을 포함하고 있습니다. 누군가가 이 문제를 해결하는 데 도움을 줄 수 있다면 매우 감사하겠습니다.

나는 며칠 동안 이에 대한 답을 찾으려고 노력하고 있습니다…

FOR %%A IN (1 2 3 4 5) DO (
    SET CFG_A=!CFG_%%A!
    IF "%DEBUG%"=="1" ECHO !CFG_A!
    FOR /f "delims=" %%i IN ('type "!CFG_A!" ^& break ^> "!CFG_A!" ') DO (
        SET "line=%%i"
        SETLOCAL enabledelayedexpansion
        SET "line=!line:%IP_V%=%IP%!"
        >>"!CFG_A!" echo(!line!
        ENDLOCAL
    )
)

답변1

게시된 코드 전체에서 확장이 지연되었으며 FOR 변수 확장 후에 확장이 지연되었습니다. 그렇습니다. %%i지연된 확장이 활성화되었기 때문에 값이 손상되었습니다.

%%i한 가지 해결책은 확장되는 동안 지연된 확장을 일시적으로 비활성화하기 위해 내부 루프 내에 추가 SETLOCAL / ENDLOCAL을 배치하는 것입니다 .

또한 파일을 TYPE할 필요가 없으며 빈 출력 파일을 생성하기 위해 이상한 리디렉션 break나 루프 내 추가 리디렉션이 필요하지 않습니다. FOR /F가 파일을 직접 읽도록 하고 내부 루프 외부로 한 번 리디렉션할 수 있습니다. 물론, 새 임시 파일에 쓴 다음 결과를 원래 이름으로 옮겨야 합니다. 그러나 이것이 훨씬 더 효율적입니다(더 빠릅니다).

FOR %%A IN (1 2 3 4 5) DO (
  IF "%DEBUG%"=="1" >&2 ECHO(!CFG_%%A!
  (FOR /f "usebackq delims=" %%i IN ("!CFG_%%A!") DO (
    SETLOCAL disableDelayedExpansion
    SET "line=%%i"
    SETLOCAL enableDelayedExpansion
    SET "line=!line:%IP_V%=%IP%!"
    echo(!line!
    ENDLOCAL
    ENDLOCAL
  ))>"!CFG_%%A!.new"
  MOVE /Y "!CFG_%%A!.new" "!CFG_%%A!" >nul
)

참고 - 저는 일괄 처리를 통해 텍스트 파일을 편집하는 것을 정말 싫어합니다. 대신에 나는JREPL.BAT - XP 이상의 모든 Windows 시스템에서 기본적으로 실행되는 하이브리드 JScript/배치 유틸리티:

FOR %%A IN (1 2 3 4 5) DO CALL JREPL "%IP_V%" "%IP%" /L /I /F "!CFG_%%A!" /O -

훨씬 더 간단하고, 더 빠르고, 더 안정적입니다 :-)

관련 정보