返回列表 发帖
本帖最后由 aloha20200628 于 2024-12-26 20:56 编辑

回复 1# xukan

以下代码存为 test.bat 运行,与源文件 *.jpg 同目录...
@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%F in ('dir /b/a-d *_*p*.jpg') do (
   set "dd=%%~nF" &set "d=!dd!" &set "n=" &(call :cutEd)
   for %%k in (!k!) do (set "d=!dd:~,%%k!")
   if not exist "!d!\" md "!d!"
   move /y "%%F" "!d!\")
pause&exit/b
:cutEd
   if "!d!"=="" (exit/b) else set "c=!d:~-1!"
   if "!c!"=="_" (exit/b) else if /i "!c!"=="p" set "k=!n!"
   set "d=!d:~,-1!" &set/a "n-=1" &goto :cutEdCOPY

TOP

回复 3# xukan

2楼代码已更新,再试试吧...

TOP


2楼代码采用 call+goto 方法,从文件名末尾回扫直到遭遇 ‘_’ 分隔符即可析取目标字符串,无论文件名头部有多少个被分割字段... call+goto方法能实现可变循环条件,确实是批处编程的一枚利器,便于解决很多字符串中给定位置或字段的精确处理问题(即逐字遍历检查+及时处理退出),只是处理大数据时会有降速,但这是先能后快的顺序或取舍的问题...

TOP

本帖最后由 aloha20200628 于 2024-12-30 15:33 编辑

回复 3# xukan

二楼代码订正后可获得如下结果
D_E_F_24ppp0001.JPG        析出        D_E_F_24p
D_E_F_52pap0002.JPG        析出        D_E_F_52p
D_E_F_63p6p0003.JPG        析出        D_E_F_63p
A_B_C_D_E_F_G_H_I_J_K_99pp0001pp.jpg  析出  A_B_C_D_E_F_G_H_I_J_K_99p
是否为楼主所需?
亦可用如下代码测试多种文件名的析取结果,以便验证后续操作前是否符合要求...
@echo off &setlocal enabledelayedexpansion
for %%F in (
   "D_E_F_24ppp0001.jpg"
   "D_E_F_52pap0002.jpg"
   "D_E_F_63p6p0003.jpg"
   "A_B_C_D_E_F_G_H_I_J_K_99pp0001pp.jpg"
) do (
   set "dd=%%~F" &set "d=!dd!" &set "n=" &(call :cutEd)
   for %%k in (!k!) do (set "d=!dd:~,%%k!")
   echo,!d!)
pause&exit/b
:cutEd
   if "!d!"=="" (exit/b) else set "c=!d:~-1!"
   if "!c!"=="_" (exit/b) else if /i "!c!"=="p" set "k=!n!"
   set "d=!d:~,-1!" &set/a "n-=1" &goto :cutEdCOPY

TOP

回复 13# xukan
回复 11# 77七

复查了一遍本帖,一是 ‘猜错’ 了3楼所求,二是好奇11楼是如何从3楼回复以及从 ‘01p12p34p.jpg’ 推断应取 ‘01p12p’ 呢?

TOP

返回列表