Home 篮球世界杯决赛 [文件操作]【已解决】用Bat读取和修改ini文件

[文件操作]【已解决】用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编码格式。

回复

举报