提取带版本号的.drw文件并保留最高版本的批处理问题
问题排查与解决方案
原脚本的核心问题
- 匹配范围错误:
*.drw仅能匹配直接以.drw结尾的文件,而目标文件是文件名.drw.版本号(如flange.drw.12),这类文件的后缀是.版本号,根本不会被*.drw捕获。 - 冗余判断无效:
if "%%~xf"==".drw"完全多余,因为*.drw已经限定了遍历对象,且目标文件不在遍历范围内。 - 致命覆盖操作:最后执行的
dir /b > files.txt会将目录下所有文件输出到files.txt,直接覆盖了前面(无效的)for循环输出,这就是你得到全类型文件的原因。
修正后的批处理脚本
@echo off setlocal enabledelayedexpansion :: 删除临时记录文件(若存在) set "tempRecord=%temp%\drw_highest_version.tmp" del "%tempRecord%" 2>nul :: 遍历所有含.drw.后缀的文件,筛选版本号为数字的目标文件 for %%f in (*.drw.*) do ( :: 提取文件基名(去掉最后一个后缀,即版本号) set "base=%%~nf" :: 提取版本号并去掉前缀的点 set "ver=%%~xf" set "ver=!ver:~1!" :: 验证版本号是否为纯数字,排除非版本文件 echo !ver! | findstr /r "^[0-9][0-9]*$" >nul if not errorlevel 1 ( :: 记录当前基名的最高版本 if not defined highest_!base! ( set "highest_!base!=!ver!" ) else ( if !ver! gtr !highest_!base! ( set "highest_!base!=!ver!" ) ) ) ) :: 将每个基名的最高版本文件写入files.txt >files.txt ( for /f "tokens=2 delims=_" %%b in ('set highest_') do ( echo %%b.!highest_%%b! ) ) endlocal echo 处理完成,结果已保存至files.txt
脚本关键逻辑说明
- 延迟变量扩展:
setlocal enabledelayedexpansion允许在for循环内部实时读取和修改变量值,是实现版本对比的核心前提。 - 文件匹配与筛选:
*.drw.*覆盖所有文件名.drw.xxx格式的文件,再通过findstr验证版本号为纯数字,避免误匹配非版本文件(如xxx.drw.backup)。 - 最高版本记录:用
highest_基名格式的变量存储每个文件基名对应的最高版本号,遍历过程中自动对比更新。 - 结果输出:通过
set highest_列出所有记录的变量,解析出基名和对应最高版本,组合成完整文件名写入目标文件。
内容的提问来源于stack exchange,提问作者DaSnipeKid
相关产品推荐
相关产品推荐

