Batch脚本:如何仅压缩目录中最新或文件名序号最大的文件
Batch游戏存档单文件备份实现
两种筛选逻辑都可以通过原生批处理命令实现,不需要额外工具,直接在原有7z压缩逻辑前加文件筛选步骤即可。
方案1:备份目录内最新修改的存档
适合不关心文件名序号、只需要备份最近一次保存的存档的场景,按文件最后修改时间排序取最新的1个文件压缩。
@echo off :: ========== 配置项 自行修改为实际路径 ========== set "ZIP_PATH=D:\7-Zip\7z.exe" set "SAVE_DIR=你的游戏存档文件夹完整路径" set "OUT_ARCHIVE=你要保存的压缩包完整路径" :: ============================================== set "TARGET=" :: 按修改时间倒序遍历所有Save开头的文件,取第一个即最新文件 for /f "delims=" %%f in ('dir /b /o:-d /a:-d "%SAVE_DIR%\Save*"') do ( set "TARGET=%%f" goto :pick_done ) :pick_done if not defined TARGET ( echo 错误:未找到符合规则的存档文件 pause exit /b 1 ) :: 执行压缩 "%ZIP_PATH%" a "%OUT_ARCHIVE%" "%SAVE_DIR%\%TARGET%" echo 备份完成,已压缩最新存档:%TARGET% pause
方案2:备份文件名序号最大的存档
适合存档严格遵循Save 数字命名规则、永远备份序号最高存档的场景,会自动提取文件名后的数字比对大小,取序号最大的文件压缩。
@echo off setlocal enabledelayedexpansion :: ========== 配置项 自行修改为实际路径 ========== set "ZIP_PATH=D:\7-Zip\7z.exe" set "SAVE_DIR=你的游戏存档文件夹完整路径" set "OUT_ARCHIVE=你要保存的压缩包完整路径" :: ============================================== set "MAX_ID=0" set "TARGET=" :: 遍历所有Save开头的文件,拆分文件名提取数字序号 for /f "tokens=1,2 delims= " %%a in ('dir /b /a:-d "%SAVE_DIR%\Save*"') do ( :: 校验后缀是否为纯数字,跳过不符合命名规则的文件 echo %%b| findstr /r "^[0-9][0-9]*$" >nul if !errorlevel! equ 0 ( if %%b gtr !MAX_ID! ( set "MAX_ID=%%b" set "TARGET=%%a %%b" ) ) ) if not defined TARGET ( echo 错误:未找到符合序号命名规则的存档文件 pause exit /b 1 ) :: 执行压缩 "%ZIP_PATH%" a "%OUT_ARCHIVE%" "%SAVE_DIR%\%TARGET%" echo 备份完成,已压缩最大序号存档:%TARGET%(序号:!MAX_ID!) pause endlocal
使用注意事项
- 如果存档带固定后缀(比如
.sav/.dat),可以把遍历规则里的Save*改成Save*.sav,避免把无关文件纳入筛选范围。 - 如果需要保留多份历史备份不覆盖,可以把压缩包路径改成带时间戳的格式,例如:
每次运行会自动生成带年月日时分的独立压缩包。set "OUT_ARCHIVE=D:\Backup\game_save_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.7z"
调试技巧:首次运行前,可以在7z压缩命令前加
echo,先打印出待压缩的文件路径,确认筛选的文件符合预期后,再去掉echo执行实际压缩,避免误压。
内容的提问来源于stack exchange,提问作者Cerulium
相关产品推荐
相关产品推荐

