潮州市上往网

使用批处理脚本实现文件按时间顺序批量重命名的完整方案

2026-03-26 13:25:02 浏览次数:1
详细信息

方案一:按修改时间排序重命名(经典方案)

@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. 基本用法

2. 功能特点

3. 安全建议

首次使用时先使用预览模式 重要文件先备份 从小批量文件开始测试 确认预览结果后再执行

4. 扩展功能

选择最适合您需求的方案,并根据实际情况调整参数即可。

相关推荐