放到图片同一目录下执行- ::图片顺序命名:前缀为目录名-后缀为等长数字(数字唯一,长度不足补0)
- ::思路:先得到文件数;再排除改好的文件;后修改其他文件名。
- @echo off
- cd/d%~dp0
-
- ::文件扩展名
- set "ext=.jpg;.png;.jpeg"
-
- ::获取目录名
- call :getDirName "%cd%" dirName
- echo 目录名 *%dirName%*
-
- set picNum=0
- ::计算图片数
- for %%p in (%ext:.=*.%)do set/a picNum+=1
- echo 目录中共有 %picNum% 个图片。
-
- ::补0个数
- set/a_0N=-1,CN=%picNum%,startNum=1
- :fill0
- set/a CN/=10,_0N+=1,startNum=%startNum%0,Nbit=_0N+1
- if %CN% neq 0 goto :fill0
- echo 起数:%startNum% 位数:%Nbit% 补0:%_0N%个。
-
- set/a renNum=startNum+1,_0=1
- ::改名
- setlocal enableDelayedExpansion
- for /f "delims=" %%p in ('dir/b %ext:.=*.%')do (
- call :oldNameChk chgYes "%%~np" "%dirName%" %picNum% %startNum%
- if defined _!chgYes! (
- call :newNameChk renNum %Nbit% "%ext%" "%dirName%"
- echo ren "%%p" "%dirName%-!renNum:~-%Nbit%!%%~xp"
- ren "%%p" "%dirName%-!renNum:~-%Nbit%!%%~xp"
- set/a renNum+=1
- )else set _!chgYes!=1
- )
-
- pause
- goto :eof
- ::====完====
-
-
- :getDirName dirPath dirName ::获取目录名
- set %2=%~nx1
- goto :eof
-
- :oldNameChk chgFlag fileName dirName fileNum beginNum ::旧名检查
- setlocal
- set "fileName=%~2"
- set "chkNum=!fileName:*%~3-=!"
- set fchk=0
- if "%~3-%chkNum%" neq %2 goto :chkend ::前缀检查:不含目录名或有多余字符
- for /f "delims=0123456789" %%s in ("%chkNum%")do set str=%%s
- if "%str%" neq "" goto :chkend ::后缀检查:后缀有非数字
- set/aN=1%chkNum%-%5
- if %N% gtr 0 if %N% leq %4 set fchk=%chkNum%
- :chkend ::跳到此处的要改名:后缀数字正常但文件名重复/未补0/不含目录名/含多余字符
- endlocal&set %1=%fchk%
- goto :eof
-
- :newNameChk renNum Numbit exts dirName ::新名检查
- setlocal
- set/a newNum=%1
- :plusNum
- for %%e in (%~3)do if exist "%~4-!newNum:~-%2!%%e" set/a newNum+=1&goto :plusNum
- endlocal&set "%1=%newNum%"
- goto :eof
复制代码
|