batch .cmd: Могу ли я перезаписать значение параметра% ~ 1 и вернуть его в функцию? - PullRequest
0 голосов
/ 08 февраля 2019

В настоящее время я запускаю пакетный скрипт для поиска подходящих строк в нескольких разных файлах.Когда строка 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%

превращается в:

до:

до:

до:

Синтаксис команды неверен.

после:

после:

после:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...