如何编写Windows批处理或VBS脚本迁移前后摄视频至旧目录适配读取程序
原有脚本错误分析
- 循环内
move命令误用通配符:原for循环确实是逐个遍历F目录下的TS文件,但循环体里的move /Y \Normal\F\*.TS ...是匹配F目录下所有TS文件,第一次循环就会把全部F文件移动到video1目录,后续循环自然无文件可匹配,导致所有文件堆在第一个目录。 - 路径写法错误:开头带反斜杠的
\Normal\F是指向当前盘符根目录,而非SD卡根目录(脚本所在目录),如果脚本不是在SD卡根目录运行会找不到路径。
正确批处理实现方案
以下脚本无需安装额外软件,直接运行即可完成目录重组,同时适配嵌入原有自动触发流程的需求:
独立运行完整版(适合单独调试使用)
@echo off setlocal enableextensions enabledelayedexpansion :: 自动切换到脚本所在目录(SD卡根目录),避免路径错误 cd /d "%~dp0" :: 基础目录校验 if not exist "Normal\F" ( echo 未找到前摄目录 Normal\F,脚本退出 pause exit /b 1 ) if not exist "Normal\R" ( echo 未找到后摄目录 Normal\R,脚本退出 pause exit /b 1 ) set count=0 :: 逐个遍历前摄目录的TS文件 for %%i in ("Normal\F\*.TS") do ( set /a count += 1 :: 推导对应后摄文件路径:将F目录路径替换为R目录,文件名后缀F替换为R set "current_f=%%i" set "current_r=Normal\R\!current_f:Normal\F\=!" set "current_r=!current_r:F.TS=R.TS!" :: 创建目标目录,已存在则不报错 mkdir "video!count!" 2>nul :: 移动当前前摄文件,重命名为video.TS move /Y "%%i" "video!count!\video.TS" >nul :: 校验后摄文件存在再移动,避免报错 if exist "!current_r!" ( move /Y "!current_r!" "video!count!\video2.TS" >nul ) else ( echo 警告:第!count!段录像未找到对应后摄文件 !current_r! ) ) echo 处理完成,共生成 !count! 个录像目录 pause endlocal
嵌入自动流程精简版(可直接插入原有批处理逻辑)
移除了所有交互提示,适合静默执行:
@echo off setlocal enableextensions enabledelayedexpansion :: 切换到脚本所在的SD卡根目录 cd /d "%~dp0" :: 无前摄目录则直接退出不处理 if not exist "Normal\F" exit /b 1 set count=0 for %%i in ("Normal\F\*.TS") do ( set /a count += 1 :: 推导对应后摄文件路径 set "current_f=%%i" set "current_r=Normal\R\!current_f:Normal\F\=!" set "current_r=!current_r:F.TS=R.TS!" mkdir "video!count!" 2>nul move /Y "%%i" "video!count!\video.TS" >nul if exist "!current_r!" move /Y "!current_r!" "video!count!\video2.TS" >nul ) endlocal
实现逻辑说明
- 不再使用通配符匹配全部文件,每次循环仅处理当前遍历到的单个前摄文件,从根源上解决文件全部堆在第一个目录的问题
- 通过字符串自动替换推导对应后摄文件路径,保证前后摄同编号文件严格匹配
- 自动定位脚本所在目录,避免路径写错导致找不到文件的问题,适配SD卡盘符变化的场景
- 增加基础校验,避免缺文件时脚本直接报错中断
内容的提问来源于stack exchange,提问作者user1684922
相关产品推荐
相关产品推荐

