Board logo

标题: [文件操作] 【已解决】用Bat读取和修改ini文件 [打印本页]

作者: lqlnfghy    时间: 2023-8-17 17:45     标题: 【已解决】用Bat读取和修改ini文件

本帖最后由 lqlnfghy 于 2023-8-19 10:53 编辑

大佬们,我有个需求研究了好久没成功,请大佬们帮忙指导下,游戏目录下有一个config.ini文件用来引导进两个不同的服务器,文件内容如下:
  1. [General]
  2. cps=mihoyo
  3. channel=1
  4. game_version=4.0.0
  5. sub_channel=1
  6. sdk_version=
  7. plugin_7_version=1.0.0
复制代码
我想通过一个Bat文件修改config.ini中的配置,实现一键切换服务器。
之前的方案是复制一个configA.ini作为替换文件,然后通过下面的代码修改文件名:
  1. ren config.ini configB.ini
  2. ren configA.ini config.ini
  3. ren configB.ini configA.ini
复制代码
但是这样有个弊端就是游戏版本号更新后,版本号会变化,我得手动把config.ini和configA.ini的版本号修改成对应的新号才能保持生效,所以希望弄个只修改对应几个参数的方案,版本号和其他参数由游戏自动更新

1.打开Bat时询问选择进哪一个服务器
--如果选择B服务器,其他参数保持不变,以下三个参数修改为:
  1. cps=bilibili
  2. channel=14
  3. sub_channel=0
复制代码
--如果选择A服务器,其他参数保持不变,以下三个参数修改为:
  1. cps=mihoyo
  2. channel=1
  3. sub_channel=1
复制代码
(如果这个不方便实现的话,也可以先读取配置,如果配置是A服,则切换为B服,如果是B服则切换为A服)
作者: yakeyun    时间: 2023-8-17 18:49

本帖最后由 yakeyun 于 2023-8-19 12:43 编辑

回复 1# lqlnfghy

未测试,不知道效果。
  1. @echo off
  2. %1 %2
  3. ver|find "5.">nul&&goto :Admin
  4. mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
  5. :Admin
  6. cd /d "%~dp0"
  7. if not exist %SystemRoot%\System32\sed.exe (curl -O http://bcn.bathome.net/tool/4.9/sed.exe & move /y "sed.exe" "%SystemRoot%\System32\sed.exe")
  8. ::定义配置文件路径位置
  9. set files=xxx\config.ini
  10. for /f %%a in ('type "%files%" ^|find /i "cps=bilibili"') do set Server=B
  11. if defined B (
  12. sed 10s/cps=bilibili/cps=mihoyo/g %files% >A.ini
  13. sed 10s/channel=14/channel=1/g A >A.ini
  14. sed 10s/sub_channel=0/sub_channel=1/g A >A.ini
  15. ) else (
  16. sed 10s/cps=mihoyo/cps=bilibili/g %files% >B.ini
  17. sed 10s/channel=1/channel=14/g B >B.ini
  18. sed 10s/sub_channel=1/sub_channel=0/g B >B.ini
  19. )
  20. if exist A.ini (del %files% && copy A.ini %files% && del A.ini)
  21. if exist B.ini (del %files% && copy B.ini %files% && del B.ini)
  22. exit
复制代码

作者: hfxiang    时间: 2023-8-17 19:13

回复 1# lqlnfghy
可以用sed( http://bcn.bathome.net/tool/4.9/sed.exe )来实现:
  1. @echo off
  2. set "Ser_No="
  3. set /p Ser_No=请输入服务器号(A 或 B):A
  4. if /i "%Ser_No%"=="B" (
  5. sed -i -r "/^\[General\]$/,/^\[/{/^(cps)=.+$/s//\1=bilibili/;/^(channel)=.+$/s//\1=14/;/^(sub_channel)=.+$/s//\1=4/;}" config.ini
  6. ) else (
  7. sed -i -r "/^\[General\]$/,/^\[/{/^(cps)=.+$/s//\1=mihoyo/;/^(channel)=.+$/s//\1=1/;/^(sub_channel)=.+$/s//\1=1/;}" config.ini
  8. )
复制代码

作者: Batcher    时间: 2023-8-17 19:28

回复 1# lqlnfghy
  1. @echo off
  2. set "FileOld=config.ini"
  3. set "MyInput="
  4. set /p "MyInput=Which server? "
  5. set "FileTemp=config.ini.tmp"
  6. cd /d "%~dp0"
  7. >"%FileTemp%" echo [General]
  8. (for /f "skip=1 tokens=1* delims=:" %%a in ('findstr /n .* "%FileOld%"') do (
  9.     if "x%%b" neq "x" (
  10.         for /f "tokens=1* delims==" %%i in ("%%b") do (
  11.             if "%%i" equ "cps" (
  12.                 if /i "%MyInput%" equ "A" (
  13.                     echo %%i=mihoyo
  14.                 ) else (
  15.                     echo %%i=bilibili
  16.                 )
  17.             ) else if "%%i" equ "channel" (
  18.                 if /i "%MyInput%" equ "A" (
  19.                     echo %%i=1
  20.                 ) else (
  21.                     echo %%i=14
  22.                 )
  23.             ) else if "%%i" equ "sub_channel" (
  24.                 if /i "%MyInput%" equ "A" (
  25.                     echo %%i=1
  26.                 ) else (
  27.                     echo %%i=0
  28.                 )
  29.             ) else (
  30.                 echo %%i=%%j
  31.             )
  32.         )
  33.     ) else (
  34.         echo,
  35.     )
  36. ))>>"%FileTemp%"
  37. move /y "%FileTemp%" "%FileOld%"
复制代码

作者: Five66    时间: 2023-8-17 19:32

看了半天才稍微看懂
建议分成多个配置文件让游戏自己选择
config.ini只记录版本号
A服务器就读取A服务器的配置文件
B服务器就读取B服务器的配置文件
作者: 77七    时间: 2023-8-17 20:19

本帖最后由 77七 于 2023-8-17 20:40 编辑
  1. @echo off
  2. set "file=D:\test\1.ini"
  3. rem 批处理保存为ansi编码格式。4、5行注释其中一行,4为选择,5为切换。
  4. rem choice /c ab /m "choose"
  5. find "cps=mihoyo" <"%file%" 1>nul
  6. if %errorlevel% equ 1 (
  7.         set str_cps=mihoyo
  8.         set str_channel=1
  9.         set str_sub_channel=1
  10. ) else (
  11.         set str_cps=bilibili
  12.         set str_channel=14
  13.         set str_sub_channel=0
  14. )
  15. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
  16.         (for /f "tokens=1* delims==" %%c in ("%%b") do (
  17.                 if "%%c" equ "cps" (
  18.                         echo %%c=%str_cps%
  19.                 ) else if "%%c" equ "channel" (
  20.                         echo %%c=%str_channel%
  21.                 ) else if "%%c" equ "sub_channel" (
  22.                         echo %%c=%str_sub_channel%
  23.                 ) else echo %%b
  24.         )) || echo=
  25. ))>tmp.ini
  26. move /y tmp.ini "%file%"
复制代码

作者: lqlnfghy    时间: 2023-8-19 10:39

本帖最后由 lqlnfghy 于 2023-8-19 10:45 编辑

回复 2# yakeyun


    非常感谢大佬耐心帮助,我这边也反馈一下测试结果,运行的时候会一闪而过,截图看是以下内容:
%Total    %Received  %Xferd  Average   Speed     Time      Time      Time      Current
                                            Dload      Upload     Total      Spent     Left        Speed
100351k  100351k      0         5491k       0         --:--:--     --:--:--   --:--:--   5762k
拒绝访问。
移动了0个文件。
系统找不到指定的文件。

并生成了几个临时文件分别是:
B.ini      (0Kb)
B.txt      (0Kb)
sed.exe (351Kb)
作者: Batcher    时间: 2023-8-19 10:43

回复 7# lqlnfghy


如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: lqlnfghy    时间: 2023-8-19 10:48

回复 3# hfxiang


    非常感谢大佬帮助,以下是测试反馈:
1.中文部分显示乱码
2.config.ini文件未被修改
作者: lqlnfghy    时间: 2023-8-19 10:50

回复 4# Batcher


    非常感谢管理员大佬,刚才试了,代码完全符合需求。
作者: lqlnfghy    时间: 2023-8-19 10:53

回复 6# 77七

非常感谢大佬的帮助,以下是代码测试反馈:
1. bat代码运行时一闪而过(截不到内容,哈哈)
2. 生成了临时文件tmp.ini (空白)
3. config.ini 文件未被修改
作者: Batcher    时间: 2023-8-19 10:58

回复 2# yakeyun


    需要管理员权限才能往%SystemRoot%\System32下面放文件
作者: Batcher    时间: 2023-8-19 11:01

回复 9# lqlnfghy


    中文乱码的问题请先检查一下3楼代码是否保存为ANSI编码
作者: Batcher    时间: 2023-8-19 11:02

回复 11# lqlnfghy


6楼代码可以这样测试:参考Q-01观察一下哪行代码在报错以及详细的报错信息
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: 77七    时间: 2023-8-19 11:44

回复 11# lqlnfghy


   
生成了空白tmp.ini,是原ini文件路径错误,代码第二行需要修改为实际路径,或路径含中文时需要保存为ansi编码格式。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2