本帖最后由 aloha20200628 于 2024-2-1 19:35 编辑
用纯P拿下本帖的一个看点是如何准确简捷地获取文件名末尾的序号最大长度(无论序号连续与否),给一个请findstr出场的版本,其一是goto方案,是可控循环。其二是for/L方案,是不可控循环,只能预设上限。
第3行代码用了老帖中关于!v!续命传值给%v%的方法,此处用之为免其后截取变量字符串时不必调用for句式方可完成的开销。
代码可存为test.bat,将目标目录拖至脚本运行即可完成其中文件更名,如*_1.pdf 》*_001.pdf- @echo off &setlocal enabledelayedexpansion
- dir /b/s/a-d "%~1\*.pdf">0.0 & (call :getMax 0.0 m)
- (endlocal & set "max=%m%") & setlocal enabledelayedexpansion
- for /L %%n in (1,1,%max%) do set "p=0!p!"
- for /f "delims=" %%F in (0.0) do (
- set "xF=%%~xF"
- for /f "tokens=1-2 delims=_" %%1 in ("%%~nF") do (set "q=!p!%%2" & ren "%%~F" "%%1_!q:~-%max%!!xF!")
- )
- del 0.0 & endlocal & exit/b
- :getMax // %1=listF %2=digits
- :[loop]
- set/a "k+=1" & set "n=!n![0-9]" & findstr "!n!\.pdf" %1>nul && goto[loop] || (set/a "%~2=k-1" & exit/b)
复制代码 随附 for/L 方案如下仅供参考- :getMax // %1=listF %2=digits
- for /L %%n in (0,1,9) do set "n=!n![0-9]" & findstr "!n!\.pdf" %1>nul || (set/a "%~2=%%n" & exit/b)
复制代码
|