windows递归遍历当前目录下文件并重命名程序

win bat写个程序递归当前目录下所有文件夹下的文件移动到当前目录,然后把所有文件重命名为2001、2002以此类推的格式,扩展名不变

我给你写一个安全、可运行、带防错的 BAT 脚本,完全满足你的需求:递归移动所有子文件夹文件到当前目录,并重命名为 2001、2002... 格式(扩展名保留)。

一、完整 BAT 脚本(直接复制保存为 move_rename.bat

bat 复制代码
@echo off
chcp 65001 >nul 2>&1  :: 解决中文文件名乱码
setlocal enabledelayedexpansion

:: 定义起始编号
set "start_num=2001"
set "current_num=!start_num!"

:: ========== 第一步:递归移动所有子文件夹文件到当前目录 ==========
echo 正在移动子文件夹中的文件到当前目录...
for /r %%f in (*) do (
    :: 排除当前脚本本身,避免移动自己
    if not "%%~nxf"=="%~nx0" (
        :: 只处理文件(排除文件夹)
        if exist "%%f" if not exist "%%f\" (
            :: 移动文件(覆盖前会提示,可去掉 /-y 强制覆盖)
            move /-y "%%f" ".\" >nul 2>&1
            if !errorlevel! equ 0 (
                echo 已移动:%%~nxf
            )
        )
    )
)

:: ========== 第二步:重命名文件为 2001、2002... 格式 ==========
echo.
echo 正在重命名文件...
for /f "delims=" %%f in ('dir /b /a-d ^| find /v "%~nx0"') do (
    :: 获取文件扩展名(无扩展名则为空)
    set "ext=%%~xf"
    :: 重命名(编号递增)
    ren "%%f" "!current_num!!ext!"
    echo 已重命名:%%f → !current_num!!ext!
    :: 编号+1
    set /a "current_num+=1"
)

echo.
echo 操作完成!起始编号:%start_num%,最终编号:!current_num!-1
pause

二、脚本关键说明

  1. 核心功能

    • for /r %%f in (*):递归遍历当前目录及所有子文件夹的文件
    • move /-y:移动文件(/-y 表示覆盖前提示,避免误删,想强制覆盖可改成 /y
    • ren "%%f" "!current_num!!ext!":重命名,保留扩展名,编号从 2001 递增
    • 自动排除脚本本身(避免移动/重命名自己)
  2. 防错设计

    • 解决中文文件名乱码(chcp 65001
    • 只处理文件、排除文件夹
    • 移动/重命名失败会跳过,不中断脚本
    • 每步有日志输出,能看到操作过程

三、使用方法

  1. 把脚本保存为 move_rename.bat,放到你要处理的根目录 (比如 D:\test);
  2. 双击运行脚本;
  3. 若有重名文件,会提示是否覆盖(按需求选 Y/N 即可);
  4. 运行完成后按任意键退出。

四、示例效果

假设原目录结构:

复制代码
当前目录/
├─ 子文件夹1/
│  ├─ 照片.jpg
│  └─ 文档.txt
├─ 子文件夹2/
│  └─ 视频.mp4
└─ move_rename.bat

运行后效果:

复制代码
当前目录/
├─ 2001.jpg
├─ 2002.txt
├─ 2003.mp4
└─ move_rename.bat

重名文件默认覆盖

总结

  1. 脚本先递归移动 所有子文件夹文件到当前目录,再按 2001、2002... 重命名(扩展名不变);
  2. 自带中文兼容、防覆盖、排除自身等防错逻辑,新手也能安全使用;
  3. 若想修改起始编号(比如从 3001 开始),只需改脚本里 start_num=2001 这一行。

如果需要调整(比如跳过特定扩展名、只处理某类文件),可以告诉我,我再修改脚本。

重名默认覆盖

我马上把脚本改成重名文件默认覆盖,同时保留其他安全逻辑(排除脚本自身、中文兼容、递归移动),你直接复制就能用。

一、修改后的完整 BAT 脚本(默认覆盖重名文件)

bat 复制代码
@echo off
chcp 65001 >nul 2>&1  :: 解决中文文件名乱码
setlocal enabledelayedexpansion

:: 定义起始编号
set "start_num=2001"
set "current_num=!start_num!"

:: ========== 第一步:递归移动所有子文件夹文件到当前目录(默认覆盖) ==========
echo 正在移动子文件夹中的文件到当前目录(重名自动覆盖)...
for /r %%f in (*) do (
    :: 排除当前脚本本身,避免移动自己
    if not "%%~nxf"=="%~nx0" (
        :: 只处理文件(排除文件夹)
        if exist "%%f" if not exist "%%f\" (
            :: 移动文件:/y 表示强制覆盖,无提示
            move /y "%%f" ".\" >nul 2>&1
            if !errorlevel! equ 0 (
                echo 已移动:%%~nxf
            )
        )
    )
)

:: ========== 第二步:重命名文件为 2001、2002... 格式 ==========
echo.
echo 正在重命名文件...
for /f "delims=" %%f in ('dir /b /a-d ^| find /v "%~nx0"') do (
    :: 获取文件扩展名(无扩展名则为空)
    set "ext=%%~xf"
    :: 重命名(编号递增),重名会直接覆盖
    ren "%%f" "!current_num!!ext!"
    echo 已重命名:%%f → !current_num!!ext!
    :: 编号+1
    set /a "current_num+=1"
)

echo.
echo 操作完成!起始编号:%start_num%,最终编号:!current_num!-1
pause

二、关键修改点说明

核心改动只有 1 处,就是把移动命令的 /−y 改成 /y

  • 原命令 move /-y:重名时提示是否覆盖(手动确认)
  • 新命令 move /y:重名时直接覆盖,无任何提示(符合你"默认覆盖"的需求)

其他逻辑完全保留:

  • 依然排除脚本自身,不会误删/误改 move_rename.bat
  • 依然递归遍历所有子文件夹
  • 依然保留文件扩展名,只改主名
  • 依然解决中文文件名乱码问题

三、使用方法(和之前一致)

  1. 保存脚本到要处理的根目录;
  2. 双击运行,全程无弹窗提示,重名文件自动覆盖;
  3. 运行完成后会显示操作日志,按任意键退出。

总结

  1. 脚本核心改动是 move /y 实现移动时默认覆盖 ,重命名环节本身BAT的ren命令也是直接覆盖重名文件;
  2. 保留了所有安全逻辑,仅取消覆盖提示,不影响整体功能;
  3. 若需要调整起始编号(比如从 1001 开始),修改 start_num=2001 即可。

如果还需要其他调整(比如只处理特定扩展名、跳过某些文件),可以随时说。

我会逐行拆解这段批处理脚本的语法和作用,兼顾批处理的核心语法规则,让你既能看懂每行代码,也能理解背后的语法逻辑。

完整逐行解读

batch 复制代码
@echo off
  • 语法说明@ 表示屏蔽当前行的命令回显;echo off 表示关闭后续所有命令的默认回显(即不在控制台显示执行的命令本身,只显示输出结果)。
  • 作用 :让脚本执行时更简洁,只输出我们主动 echo 的内容,不刷屏显示执行的命令。
batch 复制代码
chcp 65001 >nul 2>&1  :: 解决中文文件名乱码
  • 语法说明
    • chcp 65001:修改控制台的字符编码为 UTF-8(默认是 GBK),解决中文文件名/路径处理时的乱码问题;
    • >nul:将命令的标准输出(stdout) 重定向到空设备(不显示执行结果);
    • 2>&1:将命令的错误输出(stderr) 重定向到标准输出,再跟着标准输出一起到 nul,最终不显示任何提示;
    • :::批处理的注释符号(等价于 rem,但 :: 不能用在 for 循环等块内,这里在全局没问题)。
  • 作用:静默修改编码为 UTF-8,避免处理中文文件时乱码。
batch 复制代码
setlocal enabledelayedexpansion
  • 语法说明
    • setlocal:开启本地环境变量作用域(脚本结束后自动恢复原有环境);
    • enabledelayedexpansion:启用延迟变量扩展 ------批处理默认是"先解析整行/整块代码,再执行",启用后可以用 !变量名! 实时获取变量的最新值(否则用 %变量名% 只能获取解析时的值)。
  • 作用 :让后续 for 循环里的 !current_num! 能实时递增,而不是固定为初始值。
batch 复制代码
:: 定义起始编号
set "start_num=2001"
set "current_num=!start_num!"
  • 语法说明
    • set "变量名=值":定义环境变量(加引号可以避免值末尾的空格被意外包含);
    • !start_num!:因为启用了延迟扩展,用 ! 取变量值(这里等价于 %start_num%,但后续循环必须用 !)。
  • 作用 :设置文件重命名的起始编号为 2001,并把 current_num 初始化为这个值(用于递增)。
batch 复制代码
:: ========== 第一步:递归移动所有子文件夹文件到当前目录(默认覆盖) ==========
echo 正在移动子文件夹中的文件到当前目录(重名自动覆盖)...
  • 语法说明echo 文本:在控制台输出指定文本,用于提示用户当前执行步骤。
  • 作用:输出提示信息,告知用户正在执行"移动子文件夹文件"的操作。
batch 复制代码
for /r %%f in (*) do (
  • 语法说明
    • for /r:递归遍历文件(/r 表示从当前目录开始,遍历所有子目录);
    • %%f:批处理中 for 循环的循环变量(命令行中用 %f,脚本中必须用 %%f);
    • in (*):遍历所有类型的文件(* 是通配符,匹配任意文件名);
    • do (:循环体开始,后续括号内的代码对每个遍历到的文件执行。
  • 作用 :递归遍历当前目录及所有子目录下的所有文件,逐个处理。
batch 复制代码
    :: 排除当前脚本本身,避免移动自己
    if not "%%~nxf"=="%~nx0" (
  • 语法说明
    • if not "A"=="B":条件判断,当 A 不等于 B 时执行后续代码;
    • %%~nxf:提取循环变量 %%f 对应的文件的文件名+扩展名~nx 是批处理的变量修饰符:n=文件名,x=扩展名);
    • %~nx0:提取当前脚本自身的文件名+扩展名%0 表示脚本本身,~nx 同样提取文件名+扩展名)。
  • 作用:排除当前脚本文件,避免把脚本自己也移动到当前目录(防止脚本执行中被覆盖/移动导致出错)。
batch 复制代码
        :: 只处理文件(排除文件夹)
        if exist "%%f" if not exist "%%f\" (
  • 语法说明
    • if exist "%%f":判断 %%f 对应的路径是否存在;
    • if not exist "%%f\":批处理中,路径末尾加 \ 表示判断是否为文件夹------如果 %%f 是文件夹,%%f\ 会存在;如果是文件,%%f\ 不存在。
    • 两个 if 连续写,表示"同时满足两个条件"(等价于 if exist "%%f" and not exist "%%f\")。
  • 作用 :确保只处理文件 ,排除文件夹(因为 for /r (*) 理论上只遍历文件,但加这层判断更严谨)。
batch 复制代码
            :: 移动文件:/y 表示强制覆盖,无提示
            move /y "%%f" ".\" >nul 2>&1
  • 语法说明
    • move /y 源路径 目标路径:移动文件命令,/y 表示强制覆盖目标路径下的同名文件(无弹窗提示);
    • ".\":表示当前目录(. 是当前目录,\ 是路径分隔符);
    • >nul 2>&1:静默执行,不显示移动成功/失败的提示。
  • 作用:将子目录中的文件移动到当前目录,重名文件直接覆盖,且不显示移动的日志。
batch 复制代码
            if !errorlevel! equ 0 (
                echo 已移动:%%~nxf
            )
        )
    )
)
  • 语法说明
    • !errorlevel!:获取上一条命令(move)的执行结果码(启用延迟扩展后用 !);
    • equ 0equ 是"等于"的意思,errorlevel 0 表示上一条命令执行成功;
    • echo 已移动:%%~nxf:如果移动成功,输出"已移动:文件名.扩展名"。
  • 作用 :如果文件移动成功,在控制台提示用户该文件已被移动;括号依次闭合,结束第一层 for 循环。
batch 复制代码
:: ========== 第二步:重命名文件为 2001、2002... 格式 ==========
echo.
echo 正在重命名文件...
  • 语法说明echo.:输出一个空行,让控制台输出更整洁;echo 正在重命名文件...:提示用户进入重命名步骤。
  • 作用:输出空行分隔步骤,再提示用户正在执行重命名操作。
batch 复制代码
for /f "delims=" %%f in ('dir /b /a-d ^| find /v "%~nx0"') do (
  • 语法说明
    • for /f:处理命令输出的文本行(这里用于处理 dir 命令的结果);
    • "delims=":取消分隔符(默认按空格/制表符分割行,这里确保文件名含空格时能完整获取);
    • ('dir /b /a-d ^| find /v "%~nx0"'):括号内是要执行的命令:
      • dir /b /a-ddir 是列目录命令,/b 表示"裸格式"(只输出文件名,无额外信息),/a-d 表示"排除文件夹"(只列文件);
      • ^|:管道符(批处理中需要加 ^ 转义,否则会被 for 解析错误),将 dir 的输出传给 find
      • find /v "%~nx0"find /v 表示"排除包含指定字符串的行",这里排除当前脚本文件。
  • 作用 :获取当前目录下所有非脚本本身的文件的文件名(含扩展名),逐个处理。
batch 复制代码
    :: 获取文件扩展名(无扩展名则为空)
    set "ext=%%~xf"
  • 语法说明%%~xf:提取循环变量 %%f 对应的文件的扩展名 (含小数点,比如 .txt;无扩展名则为空)。
  • 作用 :把当前文件的扩展名存到 ext 变量中,方便后续重命名时保留扩展名。
batch 复制代码
    :: 重命名(编号递增),重名会直接覆盖
    ren "%%f" "!current_num!!ext!"
  • 语法说明
    • ren 原文件名 新文件名:重命名文件命令;
    • !current_num!!ext!:拼接"当前编号+扩展名"(比如 2001+.txt → 2001.txt);
    • 因为启用了延迟扩展,!current_num! 能实时获取递增后的值。
  • 作用 :将当前文件重命名为"数字编号+原扩展名"的格式(比如 照片.jpg2001.jpg)。
batch 复制代码
    echo 已重命名:%%f → !current_num!!ext!
  • 语法说明:输出重命名的提示,展示"原文件名 → 新文件名"的对应关系。
  • 作用:告知用户当前文件的重命名结果,方便核对。
batch 复制代码
    :: 编号+1
    set /a "current_num+=1"
)
  • 语法说明
    • set /a:执行算术运算(/a 是 arithmetic 的缩写);
    • current_num+=1:等价于 current_num = current_num + 1,将编号自增1;
  • 作用 :每重命名一个文件,编号就加1(比如 2001 → 2002 → 2003...);括号闭合,结束重命名的 for 循环。
batch 复制代码
echo.
echo 操作完成!起始编号:%start_num%,最终编号:!current_num!-1
pause
  • 语法说明
    • echo.:输出空行;
    • !current_num!-1:因为每重命名一个文件编号就+1,最终 current_num 是"最后一个编号+1",所以减1才是实际的最后一个文件编号;
    • pause:暂停脚本执行,等待用户按任意键(避免脚本执行完直接关闭控制台,方便查看结果)。
  • 作用:输出操作完成的提示,显示起始/最终编号,并暂停控制台。

总结

  1. 核心功能:脚本分两步执行------先递归把所有子文件夹的文件移动到当前目录(排除自身、覆盖重名),再将这些文件按"2001、2002...+原扩展名"的规则重命名。
  2. 关键语法for /r 递归遍历文件、enabledelayedexpansion 延迟变量扩展、%%~nx/f 提取文件属性、move/ren 移动/重命名文件(/y 强制覆盖)。
  3. 细节处理 :UTF-8 编码解决中文乱码、排除脚本自身避免出错、pause 暂停查看结果。
相关推荐
web3.08889992 小时前
taoxi商品详情|商品属性|包装规格信息 API接口
windows
新手88603 小时前
Oracle VirtualBox虚拟机安装 和 安装 window11版本虚拟机 及 启用EFI和硬盘无法使用 问题
服务器·windows·计算机网络·安全·虚拟机
门豪杰3 小时前
Windows下配置针对WSL的cc-switch
windows·claude·claude code·cc-switch·cc switch
姓王名礼4 小时前
一份 Windows/macOS/Linux 完整安装 + 运行 + 对接 WebUI 的步骤
linux·windows·macos
开开心心就好4 小时前
绿色版PDF多功能工具,支持编辑转换
人工智能·windows·pdf·ocr·excel·语音识别·harmonyos
武藤一雄5 小时前
C#常见面试题100问 (第一弹)
windows·microsoft·面试·c#·.net·.netcore
brucelee1867 小时前
Install OpenLM AI module management on Windows
人工智能·windows
承渊政道10 小时前
ToClaw是什么?一句话:装在云端的OpenClaw
windows·科技·学习·其他·macos·claw
NGC_661110 小时前
详解Java包装类
开发语言·windows·python