Mavic 3无人机SD卡文件清理批处理脚本故障排查求助
问题描述
我写了一个批处理脚本,用来清理Mavic 3无人机microSD卡中的文件:
- 无人机生成
.mp4(全分辨率视频)和.lrf(低分辨率视频)文件 - 拍摄的照片会生成
.jpg和对应的.lrf文件
当前脚本可完成以下操作:
- 新建
full文件夹并将所有.mp4移动进去 - 将剩余
.lrf重命名为.mp4
但存在问题:移动.mp4后,无法删除与.jpg同名的.lrf文件。对应的命令在命令行(单百分号%I)能正常运行,但放到批处理脚本(双百分号%%I)里就失效了:
for /r d:\DCIM\100MEDIA\ %%I in (*.jpg) do del %%~nI.lrf 2>nul
示例文件结构
1.lrf 1.mp4 2.lrf 2.mp4 3.jpg 3.lrf 4.lrf 4.mp4
期望最终结果
full(存放全分辨率视频的文件夹) ├─1.mp4 ├─2.mp4 └─4.mp4 3.jpg 4.mp4 # 原4.lrf重命名后的文件
完整批处理代码
@echo off mkdir d:\DCIM\100MEDIA\full for /r d:\DCIM\100MEDIA\ %%m in (*.mp4) do move "%%m" d:\DCIM\100MEDIA\full for /r d:\DCIM\100MEDIA\ %%I in (*.jpg) do del %%~nI.lrf 2>nul for /r d:\DCIM\100MEDIA\ %%l in (*.lrf) do ren "%%l" *.mp4
问题原因
- 缺少文件路径:
for /r遍历到的.jpg文件若在子目录(即使当前示例没有),del %%~nI.lrf会默认在脚本执行的当前工作目录查找.lrf,而非.jpg所在的目录,导致找不到目标文件。 - 未加引号:如果文件名包含空格或特殊字符,
del命令会解析错误,直接失效。
解决方案
修改删除.lrf的命令,补上.jpg所在的路径,并给文件名加引号:
for /r d:\DCIM\100MEDIA\ %%I in (*.jpg) do del "%%~dpI%%~nI.lrf" 2>nul
修正后的完整脚本
@echo off set "target_dir=d:\DCIM\100MEDIA" mkdir "%target_dir%\full" 2>nul # 加2>nul避免文件夹已存在时的报错 :: 移动所有mp4到full文件夹 for /r "%target_dir%" %%m in (*.mp4) do move "%%m" "%target_dir%\full" :: 删除与jpg同名的lrf文件 for /r "%target_dir%" %%I in (*.jpg) do del "%%~dpI%%~nI.lrf" 2>nul :: 将剩余lrf重命名为mp4 for /r "%target_dir%" %%l in (*.lrf) do ren "%%l" "%%~nl.mp4"
关键修改说明
%%~dpI:提取.jpg文件的驱动器号+路径,确保del命令在正确目录下查找.lrf- 给所有路径和文件名加双引号:兼容带空格或特殊字符的文件名
- 给
mkdir加2>nul:避免文件夹已存在时弹出错误提示 - 用
set定义target_dir:方便后续修改路径,提升脚本可维护性
内容的提问来源于stack exchange,提问作者E Tarasewicz
相关产品推荐
相关产品推荐

