找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: 670422423

[文本处理] 批处理修改ini文件中指定节点的键值

[复制链接]
发表于 2023-7-31 15:55:06 | 显示全部楼层

针对一楼的简单样本,老老实实用纯P代码解了。
假设源文件是ANSI/简中编码

  1. @echo off
  2. cd /d "D:\Program Files (x86)"
  3. set "newUser=abc" &set "newPw=999"
  4. setlocal enabledelayedexpansion
  5. (for /f "delims=" %%s in (src.ini) do if not defined got (
  6.                 (echo,%%s)
  7.                 if /i "%%s"=="[SERVER_DATA_2]" (set "got=1")
  8.         ) else (
  9.                 if !got! equ 1 (set "newV=%newUser%") else (set "newV=%newPw%")
  10.                 for /f "tokens=1 delims==" %%1 in ("%%s") do (echo,%%1=!newV!)
  11.                 if !got! equ 2 (set "got=") else (set/a got+=1)
  12.         )
  13. )>new.ini
  14. :: move /y new.ini src.ini REM 若保留源文件即注释此行
  15. endlocal &exit/b
复制代码
发表于 2023-7-31 16:06:19 | 显示全部楼层
回复 14# wh7288


这个场景下n+1写起来会比较麻烦(不是说完全不行),因为待修改的[SERVER_DATA_2]不一定出现在第几节。
发表于 2023-7-31 16:07:25 | 显示全部楼层
回复 6# 670422423


    3楼第2段代码可以保留空行
 楼主| 发表于 2023-7-31 16:21:08 | 显示全部楼层
回复 7# Batcher


    感谢管理员大佬。
 楼主| 发表于 2023-7-31 16:33:41 | 显示全部楼层
本帖最后由 670422423 于 2023-7-31 16:38 编辑

回复 18# Batcher


    这个bat只能在原目录使用吧,要想在其他目录使用,比如文件在D:\Program Files (x86)\program\123.ini
然后把set "FileOld=123.ini"改为"FileOld=D:\Program Files (x86)\123.ini" 会报错 提示“系统找不到文件 \Program Files (x86)\123.ini"。”
发表于 2023-7-31 21:14:32 | 显示全部楼层
回复 20# 670422423


正常来说,没有这样的问题。
请再次仔细检查你的真实路径和写在代码里面的路径是否一样。

比如文件在D:\Program Files (x86)\program\123.ini
然后把set "FileOld=123.ini"改为"FileOld=D:\Program Files (x86)\123.ini" 会报错 提示“系统找不到文件 \Program Files (x86)\123.ini"。”

你给的这个例子明显不一致。
 楼主| 发表于 2023-8-2 11:16:19 | 显示全部楼层
回复 21# Batcher


    感谢大佬指点迷津,问题已解决。以下是修改过的代码。
  1. @echo off
  2. rem cd /d "%~dp0"
  3. setlocal EnableDelayedExpansion

  4. rem set "INPUT_FILE=file.txt"
  5. set "INPUT_FILE=D:\Program Files (x86)\input.ini"
  6. set "OUTPUT_FILE=D:\Program Files (x86)\output.ini"
  7. set "DATE_TIME=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%"
  8. set "BAK_FILE=D:\Program Files (x86)\common_bak%DATE_TIME%.ini"
  9. copy "%INPUT_FILE%" "%BAK_FILE%"

  10. rem 删除上次的输出文件
  11. if exist "%OUTPUT_FILE%" del "%OUTPUT_FILE%"

  12. for /f "usebackq tokens=1,2 delims=:" %%o in (`findstr /n .* "%INPUT_FILE%"`) do (
  13.   rem echo %%p
  14.   if "%%p" equ "" (
  15.     rem 输出空行
  16.     echo. >>"%OUTPUT_FILE%"
  17.   ) else (
  18.       for /f "tokens=1* delims==" %%c in ("%%p") do (
  19.             if /i "%%c"=="[SERVER_DATA_3]" (
  20.               set "Mod_flag=true"
  21.               rem echo ----------------!Mod_flag!------------
  22.             )
  23.             rem 包含字符串“#""[”则仅输出%%c,否则进行修改
  24.             echo %%c| findstr "# [" >nul && (
  25.           set line=%%c
  26.         ) || (
  27.                   rem 修改键值对
  28.                   if /i "!Mod_flag!" equ "true" (                  
  29.                 if /i "%%c" == "SERVER_USER" (
  30.                   rem echo %%d
  31.                   set line=%%c=cccccc
  32.                           set "ChangeU=true"
  33.                 ) else if /i "%%c" == "SERVER_PASSWORD" (
  34.                    rem echo %%d
  35.                   set line=%%c=cccccc
  36.                           set "ChangeP=true"
  37.                 ) else (
  38.                   set line=%%c=%%d
  39.                 )
  40.                         rem 全部修改完毕后,重置Mod_flag标识
  41.                         if /i "!ChangeU!" equ "true" (
  42.                           if /i "!ChangeP!" equ "true" (
  43.                             set "Mod_flag=false"
  44.                           )
  45.                         )                       
  46.                   ) else (
  47.                 set line=%%c=%%d
  48.               )
  49.         )
  50.         REM 在此处修改line变量的值
  51.         echo !line!>>"%OUTPUT_FILE%"
  52.       )
  53.     )
  54. )

  55. move /y "%OUTPUT_FILE%" "%INPUT_FILE%"
  56. endlocal
  57. echo  "文件处理完成"
  58. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 15:37 , Processed in 0.018553 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表