[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 aloha20200628 于 2024-2-1 19:35 编辑


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

TOP

本帖最后由 aloha20200628 于 2024-2-1 19:20 编辑

回复 21# qd2024

增加一个子过程/函数 cutP 用于截取文件名首部小数点后两个目标字段,以小数点后序号为准匹配最大长度。
  1. @echo off &setlocal enabledelayedexpansion
  2. dir /b/s/a-d "%~1\*.mp4">0.0 & (call :getMax 0.0 m)
  3. (endlocal & set "max=%m%") & setlocal enabledelayedexpansion
  4. for /L %%n in (1,1,%max%) do set "p=0!p!"
  5. for /f "delims=" %%F in (0.0) do (
  6.    set "xF=%%~xF" & for /f "tokens=1-2 delims=." %%1 in ("%%~nF") do (
  7.      (call :cutP "%%~2" %max% s1 s2) & set "q=!p!!s1!" & ren "%%~F" "!q:~-%max%!!s2!!xF!")
  8. )
  9. del 0.0 & endlocal & exit/b
  10. :getMax // %1=listF %2=digits
  11.   :[loop]
  12.   set/a "k+=1" & set "n=!n![0-9]" & findstr "\.!n![^0-9]" "%~1">nul && goto[loop] || (set/a "%~2=k" & exit/b)
  13. :cutP // %1=nameF %2=max %3=s1 %4=s2
  14.   (set "s=%~1" & for /L %%n in (%~2,-1,0) do if "!s:~%%n,1!" geq "0" if "!s:~%%n,1!" leq "9" (
  15.      set/a "k=%%n+1" & for %%k in (!k!) do (set "%~3=!s:~,%%k!" & set "%~4=!s:~%%k!") & exit/b))
  16.   exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-2-1 19:19 编辑


24楼代码已从调试版订正为实用版,其中目标文件类型根据21楼示例中的文件类型已调整为*.mp4

TOP

返回列表