标题: [文件操作] 【已解决】用Bat读取和修改ini文件 [打印本页]
作者: lqlnfghy 时间: 2023-8-17 17:45 标题: 【已解决】用Bat读取和修改ini文件
本帖最后由 lqlnfghy 于 2023-8-19 10:53 编辑
大佬们,我有个需求研究了好久没成功,请大佬们帮忙指导下,游戏目录下有一个config.ini文件用来引导进两个不同的服务器,文件内容如下:- [General]
- cps=mihoyo
- channel=1
- game_version=4.0.0
- sub_channel=1
- sdk_version=
- plugin_7_version=1.0.0
复制代码
我想通过一个Bat文件修改config.ini中的配置,实现一键切换服务器。
之前的方案是复制一个configA.ini作为替换文件,然后通过下面的代码修改文件名:- ren config.ini configB.ini
- ren configA.ini config.ini
- ren configB.ini configA.ini
复制代码
但是这样有个弊端就是游戏版本号更新后,版本号会变化,我得手动把config.ini和configA.ini的版本号修改成对应的新号才能保持生效,所以希望弄个只修改对应几个参数的方案,版本号和其他参数由游戏自动更新
1.打开Bat时询问选择进哪一个服务器
--如果选择B服务器,其他参数保持不变,以下三个参数修改为:- cps=bilibili
- channel=14
- sub_channel=0
复制代码
--如果选择A服务器,其他参数保持不变,以下三个参数修改为:- cps=mihoyo
- channel=1
- sub_channel=1
复制代码
(如果这个不方便实现的话,也可以先读取配置,如果配置是A服,则切换为B服,如果是B服则切换为A服)
作者: yakeyun 时间: 2023-8-17 18:49
本帖最后由 yakeyun 于 2023-8-19 12:43 编辑
回复 1# lqlnfghy
未测试,不知道效果。- @echo off
- %1 %2
- ver|find "5.">nul&&goto :Admin
- mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
- :Admin
- cd /d "%~dp0"
- 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")
- ::定义配置文件路径位置
- set files=xxx\config.ini
- for /f %%a in ('type "%files%" ^|find /i "cps=bilibili"') do set Server=B
- if defined B (
- sed 10s/cps=bilibili/cps=mihoyo/g %files% >A.ini
- sed 10s/channel=14/channel=1/g A >A.ini
- sed 10s/sub_channel=0/sub_channel=1/g A >A.ini
- ) else (
- sed 10s/cps=mihoyo/cps=bilibili/g %files% >B.ini
- sed 10s/channel=1/channel=14/g B >B.ini
- sed 10s/sub_channel=1/sub_channel=0/g B >B.ini
- )
- if exist A.ini (del %files% && copy A.ini %files% && del A.ini)
- if exist B.ini (del %files% && copy B.ini %files% && del B.ini)
- exit
复制代码
作者: hfxiang 时间: 2023-8-17 19:13
回复 1# lqlnfghy
可以用sed( http://bcn.bathome.net/tool/4.9/sed.exe )来实现:- @echo off
- set "Ser_No="
- set /p Ser_No=请输入服务器号(A 或 B):A
- if /i "%Ser_No%"=="B" (
- sed -i -r "/^\[General\]$/,/^\[/{/^(cps)=.+$/s//\1=bilibili/;/^(channel)=.+$/s//\1=14/;/^(sub_channel)=.+$/s//\1=4/;}" config.ini
- ) else (
- sed -i -r "/^\[General\]$/,/^\[/{/^(cps)=.+$/s//\1=mihoyo/;/^(channel)=.+$/s//\1=1/;/^(sub_channel)=.+$/s//\1=1/;}" config.ini
- )
复制代码
作者: Batcher 时间: 2023-8-17 19:28
回复 1# lqlnfghy - @echo off
- set "FileOld=config.ini"
- set "MyInput="
- set /p "MyInput=Which server? "
- set "FileTemp=config.ini.tmp"
- cd /d "%~dp0"
- >"%FileTemp%" echo [General]
- (for /f "skip=1 tokens=1* delims=:" %%a in ('findstr /n .* "%FileOld%"') do (
- if "x%%b" neq "x" (
- for /f "tokens=1* delims==" %%i in ("%%b") do (
- if "%%i" equ "cps" (
- if /i "%MyInput%" equ "A" (
- echo %%i=mihoyo
- ) else (
- echo %%i=bilibili
- )
- ) else if "%%i" equ "channel" (
- if /i "%MyInput%" equ "A" (
- echo %%i=1
- ) else (
- echo %%i=14
- )
- ) else if "%%i" equ "sub_channel" (
- if /i "%MyInput%" equ "A" (
- echo %%i=1
- ) else (
- echo %%i=0
- )
- ) else (
- echo %%i=%%j
- )
- )
- ) else (
- echo,
- )
- ))>>"%FileTemp%"
- 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 编辑
- @echo off
- set "file=D:\test\1.ini"
- rem 批处理保存为ansi编码格式。4、5行注释其中一行,4为选择,5为切换。
- rem choice /c ab /m "choose"
- find "cps=mihoyo" <"%file%" 1>nul
- if %errorlevel% equ 1 (
- set str_cps=mihoyo
- set str_channel=1
- set str_sub_channel=1
- ) else (
- set str_cps=bilibili
- set str_channel=14
- set str_sub_channel=0
- )
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
- (for /f "tokens=1* delims==" %%c in ("%%b") do (
- if "%%c" equ "cps" (
- echo %%c=%str_cps%
- ) else if "%%c" equ "channel" (
- echo %%c=%str_channel%
- ) else if "%%c" equ "sub_channel" (
- echo %%c=%str_sub_channel%
- ) else echo %%b
- )) || echo=
- ))>tmp.ini
- 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 |