我当前正在运行一个批处理脚本,以搜索多个不同的文件以查找匹配的字符串。 当字符串 A(foobar)与 B + C(foo + bar)匹配时,提示用户输入 D(qux),替换< strong> A 和 B + D(foo + qux)。
在搜索过程中,文件会遇到多个位置,脚本会多次替换相同的A,但是我不想每次都提示用户,只是第一次遇到。
尝试创建动态函数,我为函数提供了4个不同的参数:
B(字符串的第一部分): foo
C(字符串的第二部分,将被替换):栏
X(文件位置): C:\ application.properties
Y(旧存储的B + D): fooqux
Y 本质上仅作为参数提供,以便函数知道要覆盖哪个变量(在我的代码中: batchIp 和 globalUnitName )
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
我希望:replace_properties 中的变量 batchIp 将替换为:replace_string 中 applicationProperty 的内容em>运行 set%〜4 =!applicationProperty!时。
但是
echo before: %~4
echo before: %batchIp%
echo before: %globalUnitName%
set %~4=!applicationProperty!
echo after: %~4
echo after: %batchIp%
echo after: %globalUnitName%
变成:
之前:
之前:
之前:
该命令的语法不正确。
之后:
之后:
之后: