Замініть рядок всередині циклу for для циклу в bat


2

Заміна йде добре в цьому сценарії. Я намагаюся зробити це динамічним.

SETLOCAL enabledelayedexpansion
for /f "tokens=* delims= " %%a in (C:\workspace\iwms_kw_patch_script\BuildPatchScript\140903111828_batch_file.txt) do (
    set lineString=%%a

    set str2=!lineString:C:\iwms_builder_working_directory\tmp\IWMS_KW_01_CBI_2014-003\=!
    echo !str2!

    echo IF NOT %ERRORLEVEL%==0 GOTO ERROR_HANDLER2 >> %output_file%
)
endlocal

А цей не працює ..

SETLOCAL enabledelayedexpansion
for /f "tokens=* delims= " %%a in (C:\workspace\iwms_kw_patch_script\BuildPatchScript\140903111828_batch_file.txt) do (
    set to_replace=C:\iwms_builder_working_directory\tmp\IWMS_KW_01_CBI_2014-003\
    set lineString=%%a
    set str2=!lineString:%to_replace%=!
    echo !str2!

    echo IF NOT %ERRORLEVEL%==0 GOTO ERROR_HANDLER2 >> %output_file%
)
endlocal

Чи можу я замінити рядок змінною всередині циклу for? Дякую: D

Відповіді:


0

Проблема полягає в розширенні змінної. Якщо змінна модифікована всередині forблоку коду, для доступу до її значення всередині того ж блоку потрібно затримка розширення.

Але ви не можете зробити що - щось на зразок !lineString:!to_replace!=!як аналізатор буде інтерпретувати отвір !в to_replaceякості термінації ога lineString.

Отже, у вас є два варіанти.

Найпростіший з них потребує того, щоб його значення було замінено, щоб воно було відомо перед forзапуском команди. Просто визначтеся to_replaceперед forкомандою. Коли аналізатор досягає forкоманди, змінна має правильне значення і правильно розширюється.

Але якщо з якоїсь причини вам доведеться визначити значення змінної всередині forкоманди, вам потрібно буде змінити код як

for /f "tokens=* delims= " %%a in ( .... ) do (
    set "lineString=%%a"

    set "to_replace= .... "
    for %%b in ("!to_replace!") do set "str2=!lineString:%%~b=!"

    echo !str2!
)

Це зберігає значення змінної у новий forзмінний параметр, який використовується у виразі заміни

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.