1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| @echo off chcp 65001 setlocal enabledelayedexpansion
:: 设置标题 title 文件重命名工具
:: 创建临时VBScript文件处理正则表达式 echo Set objRegExp = New RegExp > "%temp%\regex_rename.vbs" echo objRegExp.Global = True >> "%temp%\regex_rename.vbs" echo objRegExp.IgnoreCase = False >> "%temp%\regex_rename.vbs" echo strPattern = WScript.Arguments(0) >> "%temp%\regex_rename.vbs" echo strText = WScript.Arguments(1) >> "%temp%\regex_rename.vbs" echo objRegExp.Pattern = strPattern >> "%temp%\regex_rename.vbs" echo If objRegExp.Test(strText) Then >> "%temp%\regex_rename.vbs" echo set matches = objRegExp.Execute(strText) >> "%temp%\regex_rename.vbs" echo group0 = matches(0).SubMatches(0) >> "%temp%\regex_rename.vbs" echo group3 = matches(0).SubMatches(3) >> "%temp%\regex_rename.vbs" echo group2 = matches(0).SubMatches(2) >> "%temp%\regex_rename.vbs" echo WScript.Echo "MATCH:" ^& group0 ^& "|" ^& group3 ^& "|" ^& group2 >> "%temp%\regex_rename.vbs" echo Else >> "%temp%\regex_rename.vbs" echo WScript.Echo "NO_MATCH" >> "%temp%\regex_rename.vbs" echo End If >> "%temp%\regex_rename.vbs"
:: 提示用户输入参数 echo. echo ================================================ echo 文件重命名工具 echo ================================================ echo * 执行前务必先备份! echo * 仅处理指定目录下的所有文件,不包含子目录 echo * 目标路径默认: D:\WorkSpace\files\ echo * 匹配规则默认: ^(\d{4})-(\d{2})-\d{2}\s+(bad debt provision)_(\d+)$ echo * 替换规则默认: $1-$4 $3 echo ================================================ echo.
set "defaultDir=D:\WorkSpace\files\" set "defaultMatch=^(\d{4})-(\d{2})-\d{2}\s+(bad debt provision)_(\d+)$" set "defaultReplace=$1-$4 $3"
echo.
:: 处理正则表达式输入(为空则使用默认) set /p "targetDir=目标目录路径 (直接回车使用默认): " if "!targetDir!"=="" ( echo - 默认:!defaultDir! set "targetDir=!defaultDir!" ) echo.
set /p "matchRegex=匹配正则 (直接回车使用默认): " if "!matchRegex!"=="" ( echo - 默认:!defaultMatch! set "matchRegex=!defaultMatch!" ) echo.
set /p "replaceRegex=替换匹配 (直接回车使用默认): " if "!replaceRegex!"=="" ( echo - 默认:!defaultReplace! set "replaceRegex=!defaultReplace!" ) echo. echo.
:: 处理目录路径 set "targetDir=!targetDir:/=\!" if "%targetDir%"=="" ( color 04 echo 错误:目标目录路径为空! del "%temp%\regex_rename.vbs" >nul 2>&1 pause exit /b 1 )
if "%targetDir:~-1%" neq "\" set "targetDir=%targetDir%\"
:: 检查目标目录是否存在 if not exist "%targetDir%" ( color 04 echo 错误:目标目录不存在! del "%temp%\regex_rename.vbs" >nul 2>&1 pause exit /b 1 )
:: 初始化计数器 set "successCount=0" set "failCount=0" set "noMatchCount=0"
:: 处理目标目录中的所有文件(不包含子目录) echo ==================== START ====================
for /f "delims=" %%f in ('dir /b /a-d "%targetDir%\*" 2^>nul') do ( set "fileName=%%~nf" set "fileExt=%%~xf" set "fullPath=%targetDir%\%%f" echo * 开始处理文件:%%f :: 调用VBScript进行正则匹配和替换 for /f "delims=" %%r in ('cscript //nologo "%temp%\regex_rename.vbs" "%matchRegex%" "!fileName!"') do ( set "result=%%r" ) :: 处理结果 if "!result:~0,5!"=="MATCH" ( set "parsedResult=!result:MATCH:=!" for /f "tokens=1,2,3 delims=|" %%a in ("!parsedResult!") do ( set "year=%%a" set "month=%%b" set "label=%%c" if "!month:~1!"=="" ( set "month=0!month!" ) ) set "newFileName=!year!-!month! !label!" set "newFullPath=%targetDir%\!newFileName!!fileExt!" :: 检查新文件名是否与原文件名相同 if "!fileName!!fileExt!" equ "!newFileName!!fileExt!" ( echo - 跳过,替换后文件名不变 set /a failCount+=1 ) else ( :: 检查新文件是否已存在 if exist "!newFullPath!" ( echo - 失败,目标文件已存在 set /a failCount+=1 ) else ( :: 执行重命名 ren "!fullPath!" "!newFileName!!fileExt!" >nul 2>&1 if !errorlevel! equ 0 ( echo - 成功,!newFileName!!fileExt! set /a successCount+=1 ) else ( echo - 失败,重命名过程出错 set /a failCount+=1 ) ) ) ) else ( :: 未匹配到 echo - 未匹配 set /a noMatchCount+=1 ) )
:: 清理临时文件 del "%temp%\regex_rename.vbs" >nul 2>&1
echo ==================== RESULT ==================== echo 成功:%successCount% echo 失败:%failCount% echo 未匹配:%noMatchCount% echo ===================== END ====================== echo. pause endlocal
|