Замена в этом скрипте идет хорошо. Я пытаюсь сделать его динамичным.
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
решение1
Проблема в расширении переменной. Если переменная изменяется внутри for
блока кода, для доступа к ее значению внутри того же блока необходимо отложенное расширение.
Но вы не можете сделать что-то подобное, !lineString:!to_replace!=!
так как синтаксический анализатор будет интерпретировать открытие !
in to_replace
как завершение og 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
заменяемом параметре, который используется в выражении замены.