基于Bat脚本实现.sav文件分块加载与整批保存方案问询
嘿,我之前折腾过Batch读取这种分组式配置文件的需求,给你两个实用的方案,完美解决从.sav里加载特定分组数据的问题,还能顺便去掉那些分组行的引号~
方案1:逐行扫描定位目标分组(最通用)
这个方法能适配大多数情况,不管文件里的分组顺序怎么变,都能精准定位到目标分组,然后加载里面的键值对:
@echo off setlocal enabledelayedexpansion :: 这里定义你要加载的目标分组名(不用加引号和方括号) set "target_group=playerdata" set "in_target_group=0" :: 逐行读取保存文件 for /f "usebackq delims=" %%a in ("savegame.sav") do ( set "line=%%a" :: 检查当前行是不是分组标记行(比如 "[playerdata]") echo !line! | findstr /r /c:"^\[.*\]$" >nul if !errorlevel! equ 0 ( :: 去掉引号和方括号,提取纯分组名 set "current_group=!line:~2,-2!" :: 判断是不是我们要找的分组 if "!current_group!" equ "%target_group%" ( set "in_target_group=1" ) else ( :: 遇到其他分组,就停止读取当前目标分组的内容 set "in_target_group=0" ) ) else ( :: 如果正处于目标分组内,直接把键值对转换成环境变量 if !in_target_group! equ 1 ( set "!line!" ) ) ) :: 测试一下加载到的变量 echo 加载的玩家数据: echo 玩家名称:%playername% echo 玩家等级:%playerlevel% endlocal
代码解释:
enabledelayedexpansion:开启延迟扩展,让我们能在for循环里动态修改和读取变量;findstr /r /c:"^\[.*\]$":用正则匹配分组标记行,确保只识别类似"[playerdata]"的行;!line:~2,-2!:字符串截取操作,把开头的"和[、结尾的]和"都去掉,直接拿到纯分组名playerdata;set "!line!":这一步很巧妙,比如遇到playername=Steve这种行,会直接把它变成Batch环境变量%playername%,省去了手动拆分键值的麻烦。
方案2:提取目标分块后处理(适合结构固定的文件)
如果你的.sav文件分组结构很固定(比如[playerdata]永远在[inventory]前面),可以先把目标分组的整块内容提取出来,再单独处理:
@echo off setlocal enabledelayedexpansion set "target_group=inventory" set "temp_chunk=temp_inventory.txt" set "start_extract=0" :: 遍历文件,提取目标分组下的所有键值对 for /f "usebackq delims=" %%a in ("savegame.sav") do ( set "line=%%a" :: 匹配目标分组的标记行 echo !line! | findstr /r /c:"^\\"\[%target_group%\]\\"$" >nul if !errorlevel! equ 0 ( set "start_extract=1" goto :next_line ) :: 如果已经开始提取,检查是否遇到下一个分组 if !start_extract! equ 1 ( echo !line! | findstr /r /c:"^\[.*\]$" >nul if !errorlevel! equ 0 ( goto :extract_done ) :: 把当前行写入临时文件 echo !line! >> "%temp_chunk%" ) :next_line ) :extract_done :: 从临时文件加载键值对 for /f "usebackq delims=" %%a in ("%temp_chunk%") do ( set "%%a" ) :: 测试输出背包数据 echo 加载的背包数据: echo 第一格物品:%playerslotone% echo 物品数量:%plrslot1amnt% :: 清理临时文件 del "%temp_chunk%" endlocal
一些注意事项
- 如果你的数据里包含
!字符,延迟扩展会自动解析它,导致数据丢失。这时候可以在处理包含!的行时临时关闭延迟扩展; - 要是分组名里有特殊字符(比如空格、
&),需要调整findstr的正则表达式,确保能正确匹配; - 保存文件时用的
(echo ...) > savegame.sav会覆盖原有文件,如果需要追加内容,记得把>改成>>。
内容的提问来源于stack exchange,提问作者Faraday92
相关产品推荐
相关产品推荐

