В настоящее время я запускаю пакетный скрипт для поиска подходящих строк в нескольких разных файлах.Когда строка A (foobar) соответствует B + C (foo + bar) , пользователю предлагается ввести D (qux) , заменив A с B + D (foo + qux) .
Во время поиска файл встретится в нескольких местах, где скрипт будет заменять один и тот же A несколько раз, но я неЯ не хочу каждый раз запрашивать у пользователя только первое знакомство.
Пытаясь создать динамическую функцию, я снабдил свою функцию четырьмя различными параметрами:
B (Первыйчасть строки): foo
C (вторая часть строки, заменяемая): bar
X (расположение файла): C: \ application.properties
Y (Старый сохраненный B + D): fooqux
Y по существутолько предоставляется в качестве параметра, чтобы функция знала, какую переменную перезаписать (в моем коде: batchIp и globalUnitName )
Пакетный файл: Как можноУ меня есть функция гeturn значение, если параметр, переданный этой функции, содержит пробелы? Показывает, что:
SET %2 = %L%
должно быть возможным.
https://www.dostips.com/DtTutoFunctions.php Показывает, что:
set "%~1=DosTips"
должно быть возможно.
Мой код:
:replace_properties
set batchIp =
call :replace_string "batch.ip=http://" "192.168.68.132" C:\application.properties %batchIp%
call :replace_string "batch_ip = " "192.168.68.132" C:\processor.cfg %batchIp%
set globalUnitName =
call :replace_string "unit.name=" "Global_Default" C:\application.properties %globalUnitName%
:replace_string
@echo off
findstr /m "%~1%~2" %~3 >nul 2>nul
if %errorlevel%==0 (
if "%~4"=="" (
echo File: %~3
echo %~1%~2 was found, define new replacement:
set /p applicationProperty="? %~1"
IF NOT DEFINED applicationProperty SET "applicationProperty=%~2"
echo before: %~4
echo before: %batchIp%
echo before: %globalUnitName%
set %~4=!applicationProperty!
echo after: %~4
echo after: %batchIp%
echo after: %globalUnitName%
) else (
set applicationProperty="%~4"
)
powershell -Command "(gc %~3) -replace '%~1%~2' , '%~1!applicationProperty!' | Set-Content %~3"
set applicationProperty=
)
exit /B 0
Я ожидаю, что переменная batchIp внутри : replace_properties будет заменено содержимым applicationProperty внутри : replace_string при запуске set% ~ 4 =! applicationProperty! .
Однако
echo before: %~4
echo before: %batchIp%
echo before: %globalUnitName%
set %~4=!applicationProperty!
echo after: %~4
echo after: %batchIp%
echo after: %globalUnitName%
превращается в:
до:
до:
до:
Синтаксис команды неверен.
после:
после:
после: