[文件操作]【已解决】用Bat读取和修改ini文件
查看: 25952|回复: 14
[文件操作]
【已解决】用Bat读取和修改ini文件
[复制链接]
lqlnfghy
lqlnfghy
当前离线
积分23
电梯直达
1楼
发表于 2023-8-17 17:45:33
|
只看该作者
|倒序浏览
|阅读模式
本帖最后由 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服)
评分
参与人数 1PB +2
收起
理由
Batcher
+ 2
感谢给帖子标题标注[已解决]字样
查看全部评分
回复
举报
yakeyun
yakeyun
当前离线
积分591
2楼
发表于 2023-8-17 18:49:09
|
只看该作者
本帖最后由 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
hfxiang
当前离线
积分1223
3楼
发表于 2023-8-17 19:13:12
|
只看该作者
回复 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
Batcher
当前离线
积分46264
4楼
发表于 2023-8-17 19:28:33
|
只看该作者
回复 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
Five66
当前离线
积分1645
5楼
发表于 2023-8-17 19:32:20
|
只看该作者
看了半天才稍微看懂
建议分成多个配置文件让游戏自己选择
config.ini只记录版本号
A服务器就读取A服务器的配置文件
B服务器就读取B服务器的配置文件
回复
举报
77七
77七
当前离线
积分3237
6楼
发表于 2023-8-17 20:19:44
|
只看该作者
本帖最后由 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
lqlnfghy
当前离线
积分23
7楼
楼主|
发表于 2023-8-19 10:39:54
|
只看该作者
本帖最后由 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
Batcher
当前离线
积分46264
8楼
发表于 2023-8-19 10:43:35
|
只看该作者
回复 7# lqlnfghy
如果需要上传文件,可以用阿里云盘或百度网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
回复
举报
lqlnfghy
lqlnfghy
当前离线
积分23
9楼
楼主|
发表于 2023-8-19 10:48:51
|
只看该作者
回复 3# hfxiang
非常感谢大佬帮助,以下是测试反馈:
1.中文部分显示乱码
2.config.ini文件未被修改
回复
举报
lqlnfghy
lqlnfghy
当前离线
积分23
10楼
楼主|
发表于 2023-8-19 10:50:21
|
只看该作者
回复 4# Batcher
非常感谢管理员大佬,刚才试了,代码完全符合需求。
回复
举报
lqlnfghy
lqlnfghy
当前离线
积分23
11楼
楼主|
发表于 2023-8-19 10:53:09
|
只看该作者
回复 6# 77七
非常感谢大佬的帮助,以下是代码测试反馈:
1. bat代码运行时一闪而过(截不到内容,哈哈)
2. 生成了临时文件tmp.ini (空白)
3. config.ini 文件未被修改
回复
举报
Batcher
Batcher
当前离线
积分46264
12楼
发表于 2023-8-19 10:58:53
|
只看该作者
回复 2# yakeyun
需要管理员权限才能往%SystemRoot%\System32下面放文件
回复
举报
Batcher
Batcher
当前离线
积分46264
13楼
发表于 2023-8-19 11:01:05
|
只看该作者
回复 9# lqlnfghy
中文乱码的问题请先检查一下3楼代码是否保存为ANSI编码
回复
举报
Batcher
Batcher
当前离线
积分46264
14楼
发表于 2023-8-19 11:02:39
|
只看该作者
回复 11# lqlnfghy
6楼代码可以这样测试:参考Q-01观察一下哪行代码在报错以及详细的报错信息
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
回复
举报
77七
77七
当前离线
积分3237
15楼
发表于 2023-8-19 11:44:26
|
只看该作者
回复 11# lqlnfghy
生成了空白tmp.ini,是原ini文件路径错误,代码第二行需要修改为实际路径,或路径含中文时需要保存为ansi编码格式。
回复
举报