You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量重命名含空格复杂文件名及恢复的批处理脚本问题

批量重命名媒体文件并恢复原名的问题解决

需求说明

  • 将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

关键修正点

  1. for /F "usebackq delims=" %%G in ("%%F"):
    • delims= 取消默认的空格、制表符分隔规则,确保读取txt文件的整行内容
    • usebackq 支持读取包含特殊字符的文件路径及内容
  2. 移除原脚本中重复拼接扩展名的错误逻辑:txt文件记录的原文件名已包含完整扩展名,直接用ren "%%H" "%%G"即可完成恢复
  3. 修正扩展名判断逻辑:直接使用%%~xH获取的带点扩展名(如.mp3)进行判断,避免格式错误

内容的提问来源于stack exchange,提问作者runtime64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:00:55