DelayedExpansion & Проблемы Замены Переменных

у меня есть этот пакетный скрипт, который пролистывает 5 статических переменных set, содержащих путь к файлу 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
    )
)
24
задан JakeGould
25.11.2022 12:28 Количество просмотров материала 3068
Распечатать страницу

1 ответ

вы, очевидно, задержали расширение по всему опубликованному коду, а отложенное расширение происходит после для переменного расширения. Так что да, значение %%i поврежден, так как включено отложенное расширение.

одно из решений заключается в том, чтобы поставить дополнительный SETLOCAL / ENDLOCAL в вашем внутреннем цикле, чтобы временно отключить отложенное расширение в то время как %%i расширяется.

кроме того, нет необходимости вводить файл, и нет необходимости в нечетном перенаправленном перерыве для создания пустой выходной файл или добавляемое перенаправление в цикле. Вы можете просто позволить 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-гибридная утилита JScript/batch, которая изначально работает на любой машине Windows из XP вперед:

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

гораздо проще, быстрее и надежнее: -)

1
отвечен dbenham 2022-11-26 20:16

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх