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

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

[复制链接]
发表于 2023-7-28 17:12:20 | 显示全部楼层 |阅读模式
本帖最后由 670422423 于 2023-7-28 17:57 编辑

[SERVER_DATA_1]
SERVER_USER=123
SERVER_PASSWORD=123
[SERVER_DATA_2]
SERVER_USER=456
SERVER_PASSWORD=456
文件内容,文件格式为.ini,需要修改的内容如上示例,需要修改[SERVER_DATA_2]节点下SERVER_USER,SERVER_PASSWORD的值,并且文件所在路径中有空格“D:\Program Files (x86)\”
求大佬帮忙,报酬您说。
系统为win7
发表于 2023-7-28 17:53:07 | 显示全部楼层
¥20,bat存为ANSI/GB2312编码
  1. <# :
  2. cls&echo off&cd /d "%~dp0"&set "current=%cd%"
  3. path %SYSTEMROOT%\System32\WindowsPowerShell\v1.0;%path%
  4. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal "%~f0"|Out-String|Invoke-Expression"
  5. pause
  6. exit
  7. #>
  8. $inifile="D:\Program Files (x86)\xxx.ini";
  9. if(-not (test-path -literal $inifile)){write-host ('"'+$inifile+'" path error or not exist');exit;}

  10. $codes=@'
  11. using System;
  12. using System.Runtime.InteropServices;
  13. public static class EditINI
  14. {
  15.     [DllImport("kernel32")]
  16.     public static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
  17. }
  18. '@;
  19. Add-Type -TypeDefinition $codes;

  20. [EditINI]::WritePrivateProfileString('SERVER_DATA_2', 'SERVER_USER', '112233', $inifile);
  21. [EditINI]::WritePrivateProfileString('SERVER_DATA_2', 'SERVER_PASSWORD', '88888', $inifile);
复制代码
发表于 2023-7-28 17:58:11 | 显示全部楼层
回复 1# 670422423

请参考Q-04和Q-05把bat文件和ini文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

不保留空行.bat
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. set "FileOld=1.ini"
  5. set "FileNew=2.ini"
  6. set "BeginChange="
  7. (for /f "tokens=1,2 delims==" %%a in ('type "%FileOld%"') do (
  8.     if "%%b" equ "" (
  9.         set "ThisRow=%%a"
  10.     ) else (
  11.         set "ThisRow=%%a=%%b"
  12.     )
  13.     if "%%a" equ "[SERVER_DATA_2]" (
  14.         echo,!ThisRow!
  15.         set "BeginChange=true"
  16.     ) else if "!BeginChange!" equ "true" (
  17.         if "%%a" equ "SERVER_USER" (
  18.             echo,%%a=bbs.bathome.net
  19.             set "ChangeU=true"
  20.         ) else if "%%a" equ "SERVER_PASSWORD" (
  21.             echo,%%a=www.bathome.net
  22.             set "ChangeP=true"
  23.         ) else (
  24.             echo,!ThisRow!
  25.         )
  26.         if "!ChangeU!" equ "true" (
  27.             if "!ChangeP!" equ "true" (
  28.                 set "BeginChange=false"
  29.             )
  30.         )
  31.     ) else (
  32.         echo,!ThisRow!
  33.     )
  34. ))>"%FileNew%"
复制代码
保留空行.bat
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. set "FileOld=1.ini"
  5. set "FileNew=2.ini"
  6. set "BeginChange="
  7. (for /f "tokens=1,2 delims=:" %%i in ('findstr /n .* "%FileOld%"') do (
  8.     if "%%j" equ "" (
  9.         echo,
  10.     ) else (
  11.         for /f "tokens=1,2 delims==" %%a in ("%%j") do (
  12.             if "%%b" equ "" (
  13.                 set "ThisRow=%%a"
  14.             ) else (
  15.                 set "ThisRow=%%a=%%b"
  16.             )
  17.             if "%%a" equ "[SERVER_DATA_2]" (
  18.                 echo,!ThisRow!
  19.                 set "BeginChange=true"
  20.             ) else if "!BeginChange!" equ "true" (
  21.                 if "%%a" equ "SERVER_USER" (
  22.                     echo,%%a=bbs.bathome.net
  23.                     set "ChangeU=true"
  24.                 ) else if "%%a" equ "SERVER_PASSWORD" (
  25.                     echo,%%a=www.bathome.net
  26.                     set "ChangeP=true"
  27.                 ) else (
  28.                     echo,!ThisRow!
  29.                 )
  30.                 if "!ChangeU!" equ "true" (
  31.                     if "!ChangeP!" equ "true" (
  32.                         set "BeginChange=false"
  33.                     )
  34.                 )
  35.             ) else (
  36.                 echo,!ThisRow!
  37.             )
  38.         )
  39.     )
  40. ))>"%FileNew%"
复制代码
批处理读取ini文件内容并修改指定的值
http://bbs.bathome.net/thread-30373-1-1.html

批处理读取ini文件指定小节的内容
http://bbs.bathome.net/thread-57942-1-1.html
 楼主| 发表于 2023-7-28 20:31:56 | 显示全部楼层
回复 2# zaqmlp


    不能用
 楼主| 发表于 2023-7-28 21:17:20 | 显示全部楼层
回复 3# Batcher


    可以在原文件上修改,不生成新的ini文件吗
 楼主| 发表于 2023-7-28 21:27:58 | 显示全部楼层
回复  670422423

请参考Q-04和Q-05把bat文件和ini文件都保存为ANSI编码:
批处理读取ini文件内容并修改 ...
Batcher 发表于 2023-7-28 17:58



    实测可以修改,并生成新的ini文件,但是与原文件不太一样 好像把中间空行删除了。
发表于 2023-7-29 14:02:59 | 显示全部楼层
回复 5# 670422423


最后加一行:
  1. move /y "%FileNew%" "%FileOld%"
复制代码
发表于 2023-7-29 16:43:08 | 显示全部楼层
用第三方工具inifile比较容易实现,可以到这里下载:http://bcn.bathome.net/s/tool/index.html?key=inifile

然后执行:
  1. inifile a.ini [SERVER_DATA_2] SERVER_USER=123456
  2. inifile a.ini [SERVER_DATA_2] SERVER_PASSWORD=888888
复制代码
发表于 2023-7-30 18:44:43 | 显示全部楼层
回复 6# 670422423
可尝试第3方工具sed( http://bcn.bathome.net/tool/4.8/sed.exe

  1. sed -r -i "/^\[SERVER_DATA_2\]$/,/^\[.*$/{s/^SERVER_USER=.*$/SERVER_USER=ABCDEFG/;s/^SERVER_PASSWORD=.*$/SERVER_PASSWORD=abcdefg/}" "D:\Program Files (x86)\1.txt"
复制代码
发表于 2023-7-31 08:40:06 | 显示全部楼层
本帖最后由 wh7288 于 2023-7-31 08:55 编辑
  1. set "LocalDir=D:\Program Files(x86)\111.ini"
  2. set "NewDir=D:\Program Files(x86)\111.ini.txt"

  3. setlocal enabledelayedexpansion

  4. if exist "%LocalDir%" (

  5.                 for /f "delims=" %%i in  ('findstr /N .* %LocalDir%') do (               

  6.                         set "str=%%i"
  7.                         set "str=!str:*:=!"

  8.                         if "!str!" equ "SERVER_USER=456" (

  9.                                 echo SERVER_USER=XXXXXX

  10.                         ) else if "!str!" equ "SERVER_PASSWORD=456"(

  11.                                 echo SERVER_PASSWORD=XXXXXX
  12.                        
  13.                         ) else (
  14.                        
  15.                                 echo.!str!
  16.                         )
  17.                  )>>%NewDir%
  18.   )

  19. endlocal

  20. echo F|xcopy  /c /r /y  %NewDir%  %LocalDir%

  21. del /q %NewDir%

  22. pause
复制代码
发表于 2023-7-31 08:44:26 | 显示全部楼层
回复 2# zaqmlp


    弱弱的问一句:大佬,这是bat代码吗?
发表于 2023-7-31 10:26:54 | 显示全部楼层
回复 10# wh7288


这代码是不行的。
1、不同的节点下面可能存在相同的用户名和密码
2、不能在代码里面把用户名和密码写死
发表于 2023-7-31 11:37:20 | 显示全部楼层
本帖最后由 77七 于 2023-8-2 14:09 编辑
  1. @echo off
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "1.ini"') do (
  3.         if defined m (
  4.                 (for /f "tokens=1 delims==" %%c in ("%%b") do (
  5.                         if "%%c" equ "SERVER_USER" (
  6.                                 echo %%c=456456456
  7.                         ) else if "%%c" equ "SERVER_PASSWORD" (
  8.                                 echo %%c=456456456
  9.                         ) else echo=%%b
  10.                         if defined SERVER_USER if defined SERVER_PASSWORD (
  11.                                 set m=
  12.                         )
  13.                 )) || echo=%%b
  14.         ) else (
  15.                 if "%%b" equ "[SERVER_DATA_2]" (
  16.                         set m=1
  17.                 )
  18.                 echo=%%b
  19.         )
  20. ))>"2.ini"
  21. move /y "2.ini" "1.ini"
  22. pause
复制代码
思维混乱写错了,修改一下
  1. @echo off
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "1.ini"') do (
  3.         if defined m (
  4.                 (for /f "tokens=1 delims==" %%c in ("%%b") do (
  5.                         if "%%c" equ "SERVER_USER" (
  6.                                 echo %%c=456456456
  7.                         ) else if "%%c" equ "SERVER_PASSWORD" (
  8.                                 echo %%c=456456456
  9.                                 set m=
  10.                         ) else echo=%%b
  11.                 )) || echo=%%b
  12.         ) else (
  13.                 if "%%b" equ "[SERVER_DATA_2]" (
  14.                         set m=1
  15.                 )
  16.                 echo=%%b
  17.         )
  18. ))>"2.ini"
  19. move /y "2.ini" "1.ini"
  20. pause
复制代码
发表于 2023-7-31 12:34:16 | 显示全部楼层
本帖最后由 wh7288 于 2023-7-31 13:04 编辑

回复 12# Batcher

管理员大佬,您好.
本人刚接触多终端管理工作,也是在论坛上找到了很多提高工作效率的解决方案,在此略表谢意,感谢您和团队为新学习者做出的无私奉献.

1.如果是有多处相同的用户名\密码,我一般会增加一个变量,进行控制.
比如说 set "n=0" 如果有相同的server_user server_password, n+1
再对n进行判断,符合条件再输出赋值.

2.我没有理解您的意思,用户名密码不写在代码里,还能写在哪里?
  1.       if "%%a" equ "SERVER_USER" (
  2.             echo,%%a=bbs.bathome.net
  3.             set "ChangeU=true"
  4.         ) else if "%%a" equ "SERVER_PASSWORD" (
  5.             echo,%%a=www.bathome.net
  6.             set "ChangeP=true"
  7.         ) else (
  8.             echo,!ThisRow!
  9.         )
复制代码
按照我的理解,www.bathome.net就应该是用户名密码,不也是写在代码里?
请管理员大佬指点,谢谢.
发表于 2023-7-31 14:48:29 | 显示全部楼层
回复 14# wh7288


if "!str!" equ "SERVER_USER=456" (
不应该像这样使用【老用户名】作为判断条件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 17:10 , Processed in 0.016543 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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