You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:31:16