方案一:按修改时间排序重命名(经典方案)
@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul
echo ========================================
echo 文件按时间顺序批量重命名工具
echo ========================================
echo.
:: 设置工作目录(可修改)
set "work_dir=%~dp0"
echo 当前工作目录: %work_dir%
:: 询问用户输入
set /p prefix=请输入文件名前缀(默认: file_):
if "%prefix%"=="" set "prefix=file_"
set /p start_num=请输入起始编号(默认: 1):
if "%start_num%"=="" set "start_num=1"
:: 询问重命名模式
echo.
echo 请选择排序方式:
echo 1. 按修改时间排序(从旧到新)
echo 2. 按修改时间排序(从新到旧)
echo 3. 按创建时间排序(从旧到新)
echo 4. 按创建时间排序(从新到旧)
set /p choice=请选择(1-4, 默认: 1):
if "%choice%"=="" set "choice=1"
if "%choice%"=="1" set "sort_option=/od"
if "%choice%"=="2" set "sort_option=/o-d"
if "%choice%"=="3" set "sort_option=创建时间"
if "%choice%"=="4" set "sort_option=创建时间倒序"
echo.
echo 正在扫描文件...
echo.
:: 临时文件记录时间和文件名
set "temp_file=%temp%\filelist_%random%.txt"
:: 根据选择使用不同的排序方法
if "%choice%"=="1" (
:: 方法1: 按修改时间排序(dir命令直接排序)
dir /b /a-d /od "%work_dir%*.*" > "%temp_file%"
) else if "%choice%"=="2" (
:: 方法2: 按修改时间倒序
dir /b /a-d /o-d "%work_dir%*.*" > "%temp_file%"
) else if "%choice%"=="3" (
:: 方法3: 按创建时间排序(需要复杂处理)
echo 正在按创建时间排序...
cmd /c "dir /a-d /tc /o:d "%work_dir%" | findstr /r /c:"^[0-9]" > "%temp_file%""
) else if "%choice%"=="4" (
:: 方法4: 按创建时间倒序
echo 正在按创建时间倒序排序...
cmd /c "dir /a-d /tc /o:-d "%work_dir%" | findstr /r /c:"^[0-9]" > "%temp_file%""
)
:: 计数器
set /a count=0
set /a file_num=%start_num%
echo 重命名预览:
echo -------------------------------
:: 读取文件列表并进行重命名
for /f "tokens=*" %%f in ('type "%temp_file%"') do (
set "filename=%%f"
:: 提取纯文件名(对于dir完整输出)
for /f "tokens=4*" %%a in ("%%f") do set "filename=%%b"
if not "!filename!"=="" (
:: 获取文件扩展名
for %%e in ("!filename!") do set "ext=%%~xe"
:: 格式化编号(4位数字)
set "formatted_num=0000!file_num!"
set "formatted_num=!formatted_num:~-4!"
:: 新文件名
set "new_name=!prefix!!formatted_num!!ext!"
:: 显示预览
echo [!filename!] -> [!new_name!]
:: 执行重命名(先注释掉预览)
rem ren "!filename!" "!new_name!"
set /a file_num+=1
set /a count+=1
)
)
:: 清理临时文件
del "%temp_file%" 2>nul
echo.
echo -------------------------------
echo 总计处理文件数: %count%
echo.
echo 注意:以上仅为预览!
echo 要实际执行重命名,请删除第65行的"rem"关键字
echo.
pause
方案二:使用Robocopy获得更精确的时间排序
@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul
echo ========================================
echo 精确时间排序批量重命名工具
echo ========================================
echo.
set "source_dir=%~dp0"
set "temp_dir=%temp%\rename_temp_%random%"
mkdir "%temp_dir%" 2>nul
:: 用户输入
set /p prefix=输入文件名前缀(默认: img_):
if "%prefix%"=="" set "prefix=img_"
set /p start_num=起始编号(默认: 1):
if "%start_num%"=="" set "start_num=1"
echo.
echo 排序选项:
echo 1. 按修改时间(旧->新)
echo 2. 按修改时间(新->旧)
echo 3. 按创建时间(旧->新)
echo 4. 按创建时间(新->旧)
echo 5. 按访问时间(旧->新)
set /p time_choice=请选择(1-5, 默认: 1):
:: 设置时间字段
if "%time_choice%"=="1" set "time_field=write" & set "sort_order=/s"
if "%time_choice%"=="2" set "time_field=write" & set "sort_order=/s-"
if "%time_choice%"=="3" set "time_field=create" & set "sort_order=/s"
if "%time_choice%"=="4" set "time_field=create" & set "sort_order=/s-"
if "%time_choice%"=="5" set "time_field=access" & set "sort_order=/s"
if "%time_choice%"=="" set "time_field=write" & set "sort_order=/s"
:: 生成详细文件列表
echo 正在分析文件时间信息...
dir /a-d /q /s /t:%time_field:create=c:write=w:access=a% "%source_dir%" > "%temp_dir%\filelist.txt"
:: 提取并排序文件名
set "sorted_list=%temp_dir%\sorted.txt"
(
for /f "tokens=*" %%a in ('type "%temp_dir%\filelist.txt" ^| findstr /v /c:" 的目录" ^| findstr /v "驱动器 卷" ^| findstr /r "^[0-9]"') do (
for /f "tokens=4*" %%b in ("%%a") do echo %%c
)
) > "%sorted_list%"
:: 重命名处理
set /a counter=%start_num%
set /a total=0
echo.
echo ========== 重命名预览 ==========
for /f "delims=" %%f in ('type "%sorted_list%"') do (
set "old_name=%%~nxf"
set "ext=%%~xf"
if not "!old_name!"=="" (
set "padded_num=00000!counter!"
set "padded_num=!padded_num:~-5!"
set "new_name=!prefix!!padded_num!!ext!"
echo [!old_name!] -> [!new_name!]
:: 实际重命名(取消注释下一行)
rem ren "%source_dir%\!old_name!" "!new_name!"
set /a counter+=1
set /a total+=1
)
)
echo.
echo ========== 统计信息 ==========
echo 总文件数: %total%
echo 起始编号: %start_num%
echo 结束编号: !counter!
echo.
echo 提示:要执行实际重命名,请取消脚本中REM注释
echo.
:: 清理
rmdir /s /q "%temp_dir%" 2>nul
pause
方案三:带确认和回滚功能的安全版本
@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul
title 安全批量重命名工具
:: 配置
set "BACKUP_ENABLED=1"
set "LOG_ENABLED=1"
set "WORK_DIR=%~dp0"
:: 初始化
if "%LOG_ENABLED%"=="1" (
set "LOG_FILE=%WORK_DIR%rename_log_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.txt"
echo 重命名日志 - %date% %time% > "%LOG_FILE%"
)
:: 显示标题
echo ╔══════════════════════════════════════╗
echo ║ 安全批量重命名工具 v2.0 ║
echo ╚══════════════════════════════════════╝
echo.
:: 用户配置
set /p "FILE_PATTERN=请输入文件匹配模式(如 *.jpg, *.txt, 默认: *.*): "
if "!FILE_PATTERN!"=="" set "FILE_PATTERN=*.*"
set /p "NAME_PREFIX=请输入文件名前缀(默认: file_): "
if "!NAME_PREFIX!"=="" set "NAME_PREFIX=file_"
set /p "START_NUM=请输入起始编号(默认: 1): "
if "!START_NUM!"=="" set "START_NUM=1"
set /p "DIGITS=请输入编号位数(默认: 4): "
if "!DIGITS!"=="" set "DIGITS=4"
echo.
echo 请选择排序方式:
echo [1] 修改时间 (从旧到新)
echo [2] 修改时间 (从新到旧)
echo [3] 文件名 (A-Z)
echo [4] 文件名 (Z-A)
echo [5] 文件大小 (小到大)
echo [6] 文件大小 (大到小)
set /p "SORT_OPTION=请选择 [1-6, 默认: 1]: "
:: 设置排序参数
if "!SORT_OPTION!"=="1" set "DIR_SORT=/od"
if "!SORT_OPTION!"=="2" set "DIR_SORT=/o-d"
if "!SORT_OPTION!"=="3" set "DIR_SORT=/on"
if "!SORT_OPTION!"=="4" set "DIR_SORT=/o-n"
if "!SORT_OPTION!"=="5" set "DIR_SORT=/os"
if "!SORT_OPTION!"=="6" set "DIR_SORT=/o-s"
if "!SORT_OPTION!"=="" set "DIR_SORT=/od"
:: 创建备份
if "%BACKUP_ENABLED%"=="1" (
set "BACKUP_DIR=%WORK_DIR%backup_%random%"
mkdir "!BACKUP_DIR!" 2>nul
echo [备份] 创建备份目录: !BACKUP_DIR!
)
:: 收集文件列表
set "TEMP_LIST=%temp%\renamelist_%random%.txt"
dir /b /a-d !DIR_SORT! "!WORK_DIR!!FILE_PATTERN!" > "!TEMP_LIST!"
:: 预览
echo.
echo ╔══════════════════════════════════════╗
echo ║ 重命名预览 ║
echo ╚══════════════════════════════════════╝
echo.
set /a COUNT=0
set /a CURRENT_NUM=!START_NUM!
for /f "usebackq delims=" %%F in ("!TEMP_LIST!") do (
set "OLD_NAME=%%F"
set "EXT=%%~xF"
:: 生成新编号
set "FORMATTED_NUM=!CURRENT_NUM!"
for /l %%i in (1,1,%DIGITS%) do (
if !FORMATTED_NUM! lss 10000 set "FORMATTED_NUM=0!FORMATTED_NUM!"
)
set "NEW_NAME=!NAME_PREFIX!!FORMATTED_NUM!!EXT!"
echo [!OLD_NAME!] → [!NEW_NAME!]
:: 记录操作
if "%LOG_ENABLED%"=="1" (
echo !OLD_NAME! !NEW_NAME! >> "!LOG_FILE!"
)
:: 备份文件
if "%BACKUP_ENABLED%"=="1" (
copy "!WORK_DIR!!OLD_NAME!" "!BACKUP_DIR!\!OLD_NAME!" >nul
)
set /a CURRENT_NUM+=1
set /a COUNT+=1
)
echo.
echo 共发现 !COUNT! 个文件
echo.
:: 确认执行
set /p "CONFIRM=是否执行重命名?(Y/N, 默认: N): "
if /i "!CONFIRM!"=="Y" (
echo.
echo 正在执行重命名...
set /a CURRENT_NUM=!START_NUM!
set /a SUCCESS=0
set /a FAILED=0
for /f "usebackq delims=" %%F in ("!TEMP_LIST!") do (
set "OLD_NAME=%%F"
set "EXT=%%~xF"
set "FORMATTED_NUM=!CURRENT_NUM!"
for /l %%i in (1,1,%DIGITS%) do (
if !FORMATTED_NUM! lss 10000 set "FORMATTED_NUM=0!FORMATTED_NUM!"
)
set "NEW_NAME=!NAME_PREFIX!!FORMATTED_NUM!!EXT!"
:: 执行重命名
ren "!WORK_DIR!!OLD_NAME!" "!NEW_NAME!" 2>nul
if errorlevel 1 (
echo [失败] !OLD_NAME! → !NEW_NAME!
set /a FAILED+=1
) else (
echo [成功] !OLD_NAME! → !NEW_NAME!
set /a SUCCESS+=1
)
set /a CURRENT_NUM+=1
)
echo.
echo ╔══════════════════════════════════════╗
echo ║ 执行结果 ║
echo ╠══════════════════════════════════════╣
echo ║ 成功: !SUCCESS! 个文件 ║
echo ║ 失败: !FAILED! 个文件 ║
if "%BACKUP_ENABLED%"=="1" (
echo ║ 备份: !BACKUP_DIR! ║
)
if "%LOG_ENABLED%"=="1" (
echo ║ 日志: !LOG_FILE! ║
)
echo ╚══════════════════════════════════════╝
) else (
echo.
echo 操作已取消
)
:: 清理
del "!TEMP_LIST!" 2>nul
echo.
pause
使用说明:
1. 基本用法:
- 将脚本保存为
.bat 文件
- 放在要重命名文件的目录中
- 双击运行,按提示操作
2. 功能特点:
- 支持多种时间排序方式
- 可自定义文件名前缀和起始编号
- 提供预览功能,防止误操作
- 支持日志记录和备份
- 可处理各种文件类型
3. 安全建议:
首次使用时先使用预览模式
重要文件先备份
从小批量文件开始测试
确认预览结果后再执行
4. 扩展功能:
- 可修改脚本支持子文件夹递归处理
- 可添加文件类型过滤
- 可支持更复杂命名规则(如添加日期时间戳)
选择最适合您需求的方案,并根据实际情况调整参数即可。