批量重命名含空格复杂文件名及恢复的批处理脚本问题
批量重命名媒体文件并恢复原名的问题解决
需求说明
- 将mp4、mp3、wav等格式的媒体文件从复杂不规则文件名重命名为
1.mp3、2.mp4这类序号文件名,保留原扩展名 - 后续能从序号文件名恢复为原文件名,支持含空格、特殊字符(如&)的复杂文件名
现有重命名脚本(可正常工作)
该脚本可完成重命名操作,并生成对应序号的txt文件记录原文件名(例如1.txt会记录原文件名Play 2019-03-06 in C.mp3):
@echo OFF @setlocal ENABLEDELAYEDEXPANSION set I=1 for %%G in (*.mp3 *.3gp *.wav *.mp4) do ( set ORIGINAL_NAME=%%~nG set ORIGINAL_EXTENSION=%%~xG ( REM 尝试重命名文件 ren "%%G" "!I!"!ORIGINAL_EXTENSION! ) && ( REM 重命名成功,生成记录文件 > "!I!.txt" echo !ORIGINAL_NAME!!ORIGINAL_EXTENSION! set /A I+=1 ) || ( REM 重命名失败提示 echo 无法重命名文件 [!ORIGINAL_NAME!]。 ) ) @endlocal
注:原脚本中or属于语法错误,已修正为直接罗列目标扩展名
恢复脚本的问题
现有恢复脚本仅能恢复无空格的文件名,含空格的文件名只会恢复空格前的部分(例如把Play 2019-03-06 in C.mp3恢复成Play.mp3),原因是读取txt文件时默认将空格作为分隔符,仅读取了第一部分内容。
原恢复脚本:
@echo OFF @setlocal ENABLEDELAYEDEXPANSION for %%F in (*.txt) do ( set BASENAME=%%~nF REM 读取txt文件中的原文件名 for /F %%G in (%%F) do ( REM 遍历对应序号的所有文件 for %%H in (!BASENAME!.*) do ( set EXTENSION=%%~xH REM 移除扩展名中的点 set EXTENSION=!EXTENSION:~1! if not "!EXTENSION!" == "txt" ( REM 执行恢复操作 ( REM 尝试将文件重命名为原名 ren "!BASENAME!.!EXTENSION!" "%%G.!EXTENSION!" ) && ( REM 恢复成功,删除记录文件 del /F /Q "%%F" ) || ( REM 恢复失败提示 echo 无法恢复文件 [!BASENAME!.!EXTENSION!] 的原名。 ) ) ) ) ) @endlocal
修正后的恢复脚本
修改读取txt文件的for /F命令,添加参数取消默认分隔符并支持特殊字符,确保完整读取原文件名:
@echo OFF @setlocal ENABLEDELAYEDEXPANSION for %%F in (*.txt) do ( set BASENAME=%%~nF REM 完整读取txt中的原文件名,取消分隔符并兼容特殊字符 for /F "usebackq delims=" %%G in ("%%F") do ( REM 遍历对应序号的非txt文件 for %%H in (!BASENAME!.*) do ( set EXTENSION=%%~xH if not "!EXTENSION!" == ".txt" ( ( REM 恢复原名,原文件名已包含扩展名,无需重复拼接 ren "%%H" "%%G" ) && ( del /F /Q "%%F" ) || ( echo 无法恢复文件 [!BASENAME!.!EXTENSION!] 的原名。 ) ) ) ) ) @endlocal
关键修正点
for /F "usebackq delims=" %%G in ("%%F"):delims=取消默认的空格、制表符分隔规则,确保读取txt文件的整行内容usebackq支持读取包含特殊字符的文件路径及内容
- 移除原脚本中重复拼接扩展名的错误逻辑:txt文件记录的原文件名已包含完整扩展名,直接用
ren "%%H" "%%G"即可完成恢复 - 修正扩展名判断逻辑:直接使用
%%~xH获取的带点扩展名(如.mp3)进行判断,避免格式错误
内容的提问来源于stack exchange,提问作者runtime64
相关产品推荐
相关产品推荐

