如何使用批处理脚本批量更新Property文件中的多个配置值
批处理脚本实现Property配置文件多值更新
我明白你现在需要把原来只能更新单个配置项的批处理脚本,改成支持批量更新多个Property配置值的版本。结合你提供的Batchenv.bat里定义的变量,我帮你调整后的脚本如下:
先回顾现有文件内容
Batchenv.bat
echo off SET sourcedir=C:\Users\1026478\Desktop\local SET INSTALL_PROD=Prod SET APPSERVER_PORT2=44444 SET ABPP_BRE_PATH=D:\\JDA\\JDA2017_3\\config\\JDAv2017_SEMs1\\bre
原test.property
I2_JDK_HOME=D:\\Java8\\jdk1.8.0_181 I2_LICENSE_FILE=D:\\license\\PSA100417.lic I2_LICENSE_FILE_LOCATION=D:\\license I2_LICENSE_FILE_NAME=PSA100417.lic I2_ORACLE_DRIVER=oracle.jdbc.driver.OracleDriver I2_ORACLE_HOME=D:\\Oracle64\\product\\12.1.0\\client_1 I2_ORACLE_HOST=sl1psadevdb2v.jdadelivers.com I2_ORACLE_INFO_1=ABPPMGR I2_ORACLE_INFO_2={E:AES}6AA9880B2F94C92CA09E7665CC4AA76B I2_ORACLE_INFO_2_XOR=@CQQLFS I2_ORACLE_INFO_3=PSADVDB I2_ORACLE_INFO_4= I2_ORACLE_JAR=D:\\Oracle64\\product\\12.1.0\\client_1\\jdbc\\lib\\ojdbc7.jar I2_ORACLE_PORT=1521 I2_PLATFORM_HOME= I2_WEBCLIENT_TYPE=NoWeb I2_WEBLOGIC_BASE_APP=D:\\JDA\\JDA2017_3\\config\\JDAv2017_SEMs1\\web\\base I2_WEBLOGIC_DOMAIN_HOME=C:\\bea\\user_projects\\domains\\mydomain I2_WEBSPHERE_APPNAME= I2_WEBSPHERE_APPNAME_BASE=base I2_WEBSPHERE_CONTEXTROOT= I2_WEBSPHERE_CONTEXTROOT_BASE=/base I2_WEBSPHERE_HOME=C:\\Program Files\\IBM\\WebSphere\\AppServer I2_WEBSPHERE_INSTALLABLE= I2_WEBSPHERE_NODE= I2_WEB_SERVER_PORT=22246 INSTALLER_UI=SWING USER_INSTALL_DIR=D:\\JDA\\JDA2017_3\\config\\JDAv2017_SEMs1
修改后的多值更新批处理脚本
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION call %~dp0\Batchenv.bat SET sourcedir=C:\Users\1026478\Desktop\local :: 定义需要更新的配置项与对应变量的映射,格式为"配置项=变量名" SET "updateList=INSTALL_PROD=INSTALL_PROD I2_WEB_SERVER_PORT=APPSERVER_PORT2 ABPP_BRE_PATH=ABPP_BRE_PATH" ( FOR /f "usebackq delims=" %%a IN ("%sourcedir%\test.Property") DO ( SET "line=%%a" SET "updated=0" :: 遍历需要更新的配置项列表 FOR %%u IN (%updateList%) DO ( FOR /f "tokens=1,2 delims==" %%g IN ("%%u") DO ( :: 检查当前行的键是否匹配要更新的配置项 FOR /f "tokens=1* delims==" %%k IN ("!line!") DO ( IF /i "%%k"=="%%g" ( ECHO(%%g=!%%h! SET "updated=1" GOTO :nextLine ) ) ) ) :: 如果没有匹配到更新项,输出原行 IF !updated! EQU 0 ECHO(!line! :nextLine ) )>newfile.property :: 覆盖原配置文件 MOVE /y newfile.Property "%sourcedir%\test.Property" GOTO :EOF
脚本关键点说明
- 配置项映射列表:通过
updateList变量定义要更新的配置项和对应的环境变量,比如I2_WEB_SERVER_PORT=APPSERVER_PORT2表示把test.property里的I2_WEB_SERVER_PORT值替换成Batchenv.bat中APPSERVER_PORT2的变量值 - 延迟扩展:启用
ENABLEDELAYEDEXPANSION后,用!变量名!的方式读取变量,避免循环中变量替换的逻辑问题 - 逐行检查更新:遍历配置文件的每一行,对比是否在更新列表中,匹配则替换值,不匹配则保留原行
- 覆盖原文件:生成新文件后用
MOVE /y强制覆盖原配置文件,确保修改生效
效果验证
运行这个脚本后,test.property里的:
INSTALL_PROD会被更新为ProdI2_WEB_SERVER_PORT会被更新为44444- 如果后续需要新增配置项或者调整更新列表,直接修改
updateList里的映射内容即可
内容的提问来源于stack exchange,提问作者Python code




