找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12158|回复: 14

[文件操作] 求助批处理识别文件名创建文件夹并将文件移入

[复制链接]
发表于 2024-12-25 19:19:15 | 显示全部楼层 |阅读模式
文件格式为:A_B_C_32P0001.JPG              D_E_F_54Ps0001.JPG
                  A_B_C_32P0002.JPG              D_E_F_54Ps0002.JPG
                              .                                               .
                              .                                               .
                              .                                               .
                  A_B_C_32P0032.JPG              D_E_F_54Ps0054.JPG
32P为图片数量,数量不固定。希望识别到数字+P截止,创建名称为A_B_C_32P和D_E_F_54P的文件夹并移入文件。
ABC DEF仅作举例,不是实际文件名。
发表于 2024-12-25 20:20:59 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-12-26 20:56 编辑

回复 1# xukan

以下代码存为 test.bat 运行,与源文件 *.jpg 同目录...

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in ('dir /b/a-d *_*p*.jpg') do (
  3.    set "dd=%%~nF" &set "d=!dd!" &set "n=" &(call :cutEd)
  4.    for %%k in (!k!) do (set "d=!dd:~,%%k!")
  5.    if not exist "!d!" md "!d!"
  6.    move /y "%%F" "!d!")
  7. pause&exit/b
  8. :cutEd
  9.    if "!d!"=="" (exit/b) else set "c=!d:~-1!"
  10.    if "!c!"=="_" (exit/b) else if /i "!c!"=="p" set "k=!n!"
  11.    set "d=!d:~,-1!" &set/a "n-=1" &goto :cutEd
复制代码
 楼主| 发表于 2024-12-26 19:36:00 | 显示全部楼层
回复 2# aloha20200628


    运行后部分结果如下
       _24p          _52p          _63p      
       _24pp        _52pap      _63p6p
   能否再优化一下,解决可能有多个P的情况。
发表于 2024-12-26 20:57:20 | 显示全部楼层
回复 3# xukan

2楼代码已更新,再试试吧...
发表于 2024-12-27 10:43:10 | 显示全部楼层
换个思路,不从数字+P来考虑问题,如果文件名满足下列条件:
1.文件名以”_“来分隔,均被分隔为4部分;
2.被分隔的第4部分,其前面字符均为数字+P的形式;
3.第2条所说的数字不以0开头。
如果满足上述条件,可以试试下面代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-3* delims=_" %%a in ('dir /b /a-d *.jpg') do (
  4.     set "n=%%d"
  5.     set /a n=n
  6.     md "%%a_%%b_%%c_!n!P" 2>nul
  7.     move "%%a_%%b_%%c_%%d" "%%a_%%b_%%c_!n!P"
  8. )
  9. pause
复制代码
发表于 2024-12-27 12:01:35 | 显示全部楼层

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

回复 6# aloha20200628
一句话惊醒梦中人。如果无论文件名中有多少个分隔符(_),表达同一类图片文件的个数(正常不会出现054P这种情况)的位置,都是紧接在最后一个”_“分隔后面,这样做可能比5楼代码更通用些,代码未经测试,可能存在问题,思路应当没有大的问题:
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  3.     set str="%%i"
  4.     setlocal enabledelayedexpansion
  5.     set "str=!str:_=" "!"
  6.     for %%j in (!str!) do (
  7.         if defined str1 (
  8.             if defined str2 (
  9.                 set "str2=!str2!_!str1!"
  10.             ) else (
  11.                 set "str2=!str1!"
  12.             )
  13.         )
  14.         set "str1=%%~j"
  15.     )
  16.     set /a "str1=str1"
  17.     md "!str2!_!str1!P" 2>nul
  18.     move "%%i" "!str2!_!str1!P"
  19.     endlocal
  20. )
  21. pause
复制代码
不善于或者是不喜欢使用goto或call语句。
谢谢!!!
发表于 2024-12-27 14:31:00 | 显示全部楼层
由于考虑不周,上面代码出了点小问题,已修改。
发表于 2024-12-28 10:04:46 | 显示全部楼层
本帖最后由 77七 于 2024-12-30 10:30 编辑
  1. @echo off
  2. cd /d "%~dp0"
  3. for /l %%l in (0,1,9) do (
  4.         for /f "delims=" %%i in ('2^>nul dir /b /a-d "*%%lp*.jpg"') do (
  5.                 set "n=#%%~ni"
  6.                 setlocal enabledelayedexpansion
  7.                 for /f "delims=|" %%d in ("!n:%%lp=|!") do (
  8.                         endlocal
  9.                         set folder=%%d
  10.                         setlocal enabledelayedexpansion
  11.                         for /l %%l in (0 1 9) do (
  12.                                 if "!folder:%%lp=!" neq "!folder!" (
  13.                                         set f=1
  14.                                 )
  15.                         )
  16.                         if not defined f (
  17.                                 md "!folder:~1!%%lP" 2>nul
  18.                                 move "!n:~1!%%~xi" "!folder:~1!%%lP"
  19.                         )
  20.                         endlocal
  21.                 )
  22.         )
  23. )
  24. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
xukan + 1 基本解决了3楼的问题

查看全部评分

发表于 2024-12-30 10:31:22 | 显示全部楼层
9楼代码已修改。
发表于 2024-12-30 13:32:47 | 显示全部楼层
逐个字符判断,适配了 如 01p12p34p.jpg 则取01p12p,保留p大小写
  1. @echo off
  2. cd /d "%~dp0"
  3. for /l %%l in (0,1,9) do (
  4.         set #"%%l"=1
  5. )
  6. for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  7.         set n=%%~ni
  8.         setlocal enabledelayedexpansion
  9.         if defined n (
  10.                 set _n=!n!
  11.                 for %%l in (128 64 32 16 8 4 2 1) do (
  12.                         if "!_n:~%%l!" neq "" (
  13.                                 set /a len+=%%l
  14.                                 set _n=!_n:~%%l!
  15.                         )
  16.                 )
  17.                 for /l %%l in (0,1,!len!) do (
  18.                         set m=!n:~%%l,1!
  19.                         if "!m!" neq "" (
  20.                                 if not defined folder (
  21.                                         if defined #"!m!" (
  22.                                                 set str=!str!!m!
  23.                                         ) else if /i "!m!" equ "p" (
  24.                                                 if defined str (
  25.                                                         if "!str:~0,1!" neq "0" (
  26.                                                                 set folder=!n:~0,%%l!!m!
  27.                                                         ) else (
  28.                                                                 set str=
  29.                                                         )
  30.                                                 )
  31.                                         ) else (
  32.                                                 set str=
  33.                                         )
  34.                                 )
  35.                         )
  36.                 )
  37.         )
  38.         if defined folder (
  39.                 md "!folder!"
  40.                 move "!n!%%~xi" "!folder!"
  41.                 echo move "!n!%%~xi" "!folder!"
  42.         )
  43.         endlocal
  44. )
  45. pause

复制代码
发表于 2024-12-30 14:37:55 | 显示全部楼层
本帖最后由 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
是否为楼主所需?
亦可用如下代码测试多种文件名的析取结果,以便验证后续操作前是否符合要求...

  1. @echo off &setlocal enabledelayedexpansion
  2. for %%F in (
  3.    "D_E_F_24ppp0001.jpg"
  4.    "D_E_F_52pap0002.jpg"
  5.    "D_E_F_63p6p0003.jpg"
  6.    "A_B_C_D_E_F_G_H_I_J_K_99pp0001pp.jpg"
  7. ) do (
  8.    set "dd=%%~F" &set "d=!dd!" &set "n=" &(call :cutEd)
  9.    for %%k in (!k!) do (set "d=!dd:~,%%k!")
  10.    echo,!d!)
  11. pause&exit/b
  12. :cutEd
  13.    if "!d!"=="" (exit/b) else set "c=!d:~-1!"
  14.    if "!c!"=="_" (exit/b) else if /i "!c!"=="p" set "k=!n!"
  15.    set "d=!d:~,-1!" &set/a "n-=1" &goto :cutEd
复制代码
 楼主| 发表于 2024-12-31 20:16:47 | 显示全部楼层
@77七 @aloha20200628 @qixiaobin0715 非常感谢,11楼已解决问题。
发表于 2025-1-5 13:22:32 | 显示全部楼层
回复 13# xukan
回复 11# 77七

复查了一遍本帖,一是 ‘猜错’ 了3楼所求,二是好奇11楼是如何从3楼回复以及从 ‘01p12p34p.jpg’ 推断应取 ‘01p12p’ 呢?
发表于 2025-1-5 15:14:15 | 显示全部楼层
回复 14# aloha20200628


    感谢大佬关注!

这个是我自己设定的处理逻辑,所以做了文字说明(应该也符合一般情况),不清楚楼主是否遇到这种情况,有问题再修改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:28 , Processed in 0.022294 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表