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

[文件操作] 批处理操作文件夹升级版

批处理操作文件夹

上次已经发帖询问了一次,http://www.bathome.net/thread-24302-1-2.html
本以为可以交差,但是又有新的要求提出,自己对照着改动了下代码,还是没有达到预期的效果,所以,

再次发帖求助下。



在同一级目录下,有N个文件夹,文件夹名称有如下规律

1)文件夹名称,一般形式采用单个大写字母+数字+“--中文”的形式。
   如: C025--参考工具书
        D146.35--海洋起源
        X443.234.4--航天工程

   文件夹特殊形式:
   1.英文大写字母+“-”+数字+“--中文”
     如:T-1--建筑史
         B-3--批处理代码

   2.由于版本的问题,此版本中包含上一版本中遗留的问题,也就是此版本对于上一版本的改动有明确标注,文件夹名称格式有如下两种情况:
   a.使用[]
     b.使用{}
   如: [A253.34]--环境
        {B346.28}--家畜
        [T-34]--种植
        {U-56}--技术


2)文件夹名称中,字母+数字的部分有类似于如下的规律
   A0,A01,A012,A013,A013.1,....
            A02,A023,A025,A025.7,....
     A1,A13,A135,A135.6,.....

3)如果文件夹名称中带小数点,规律是每个三个数字带个小数点,如:A015.273.4,最多会出现两个小

数点。

4)文件夹名称中的中文各不相同。

5)在对文件夹进行操作时,忽略掉{}及[]这类符号,按照其中包含的文件夹名称进行排序归类。

最终用批处理处理的文件夹结构树如下:

├─A-1--批处理
├─A-2--论坛
├─A-3--求学
├─A0--为何
│  ├─A01--有时
│  │  ├─A012--学习
│  │  └─[A013]--批处理
│  │      └─A013.1--感到
│  └─A02--很吃力
│      ├─A023--是因为
│      └─{A025}--资质
│          └─A025.7--愚钝
│              ├─A025.7.3--还是
│              └─A025.7.4--因为
└─A1--不够
    └─[A13]--聪明
        └─A135--苍天
            └─{A135.6}--求解

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%a in (' dir /a:d /b *--* ') do (
  4.         rem 把文件名中的“--”替换成“|”
  5.         set FullName=%%a
  6.         set "FullName=!FullName:--=|!"
  7.         rem 用“|”分割左右字符
  8.         for /f "tokens=1,2 delims=|" %%a in ("!FullName!") do (               
  9.                 set name_left=%%a
  10.                 set name_right=%%b
  11.         )
  12.         rem 去掉 []{}-
  13.         for /f "delims=[]{}" %%a in ("!name_left!") do (
  14.                 set name_left_clean=%%a
  15.                 set name_left_clean=!name_left_clean:-=!
  16.         )
  17.         rem ============================
  18.         rem 把“--”前面的字符,再次以第一个“.”进行分解
  19.         rem ============================
  20.         rem
  21.         for /f "tokens=1,* delims=." %%i in ("!name_left_clean!") do (
  22.                 set dir1=%%i
  23.                 set dir2=%%j
  24.         )
  25.         rem ============================
  26.         rem 计算第一个“.”前面的字符个数
  27.         rem ============================
  28.         rem
  29.         set str=!dir1!
  30.         
  31.         rem -------------- 计算字符个数 --------------
  32.         set len=0
  33.         for %%a in (2048 1024 512 256 128 64 32 16) do (
  34.                 if "!str:~%%a!" neq "" (
  35.                         set /a len += %%a
  36.                         set str=!str:~%%a!
  37.                 )
  38.         )
  39.         set str=!str!fedcba9876543210
  40.         set /a len += 0x!str:~16,1!
  41.         rem -------------------------------------------
  42.         rem ============================
  43.         rem 构建文件夹
  44.         rem ============================
  45.         rem
  46.         set L=!dir1:~0,1!
  47.         set d1=.
  48.         for /l %%a in (1 1 !len!) do (
  49.                 set d1=!d1!\!L!!dir1:~1,%%a!
  50.         )
  51.         set d2=
  52.         if defined dir2 (
  53.                 set _str=!dir1!
  54.                 for %%a in (!dir2:.^=,!) do (
  55.                         set d2=!d2!\!_str!.%%a
  56.                         set _str=!_str!.%%a
  57.                 )
  58.         )
  59.         set final_dir=!d1!!d2!
  60.         rem ============================
  61.         rem 创建文件夹,并移动文件夹
  62.         rem ============================
  63.         rem
  64.         md "!final_dir!" 2>nul
  65.         move "%%a" "!final_dir!"
  66.         rem ============================
  67.         rem 显示结果
  68.         rem ============================
  69.         rem
  70.         echo "%%a"
  71.         echo         md "!final_dir!"
  72.         echo         move "%%a" "!final_dir!"
  73.         echo ----------------------------------------
  74. )
  75. echo,
  76. echo 完成!请按任意键退出...
  77. pause >nul
复制代码
运行批处理后的目录树结构:
├─A0
│  ├─A0--为何
│  ├─A01
│  │  ├─A01--有时
│  │  ├─A012
│  │  │  └─A012--学习
│  │  └─A013
│  │      ├─A013.1
│  │      │  └─A013.1--感到
│  │      └─[A013]--批处理
│  └─A02
│      ├─A02--很吃力
│      ├─A023
│      │  └─A023--是因为
│      └─A025
│          ├─A025.7
│          │  ├─A025.7--愚钝
│          │  ├─A025.7.3
│          │  │  └─A025.7.3--还是
│          │  └─A025.7.4
│          │      └─A025.7.4--因为
│          └─{A025}--资质
├─A1
│  ├─A-1--批处理
│  ├─A1--不够
│  └─A13
│      ├─A135
│      │  ├─A135--苍天
│      │  └─A135.6
│      │      └─{A135.6}--求解
│      └─[A13]--聪明
├─A2
│  └─A-2--论坛
└─A3
    └─A-3--求学

TOP

回复 2# tmplinshi


    多谢版主大大,代码运行后和我最终想要的结构树还有些差距,还是用笨办法TC一个一个的操作吧。。。。不过这段代码够我研究一阵子的了。。。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=-" %%a in ('dir /ad /b *--*') do (
  3.     for /f "tokens=1* delims=-" %%i in ("%%b") do (
  4.         if "%%j" == "" (
  5.            set s=%%a&set name=%%a--%%b
  6.         ) else set s=%%a-%%i&set name=%%a-%%b
  7.     )
  8.     for /f "delims=[{}]" %%i in ("!s!") do (
  9.         if "!s!" neq "%%i" set s=%%i
  10.     )
  11.       set len=1&set s1=!s!
  12.       for %%i in (32 16 8 4 2 1) do (
  13.           if "!s1:~%%i!" neq "" (
  14.              set /a "len+=%%i"
  15.              set "s1=!s1:~%%i!"
  16.           )
  17.       )
  18.       set f=
  19.       for /l %%i in (2 1 !len!) do (
  20.           set i=!s:~,%%i!
  21.           if "!i:~-1!" neq "." (
  22.              if "!i:~-1!" neq "-" set f=!f!!i!\
  23.           )
  24.       )
  25.       md "!f!" 2>nul
  26.       move "!name!" "!f!"
  27. )
  28. pause
复制代码

TOP

回复 4# terse


    非常抱歉,工作忙有段时间没上来了。。。您写的代码运行了一下,提示报错。。。“系统找不到指定的文件”。。。而且,即使是有个别的文件夹移动成功了,也和最终想要的文件树有些许差异。。。

TOP

本帖最后由 terse 于 2013-6-19 23:51 编辑

可能当时测试范围小导致有考虑不到的情况
先说测试情况
未有 你说的找不到文件的提示
除非你的文件夹不带有--
运行代码前
  1. :.
  2. ├─A-1--批处理
  3. ├─A-2--论坛
  4. ├─A-3--求学
  5. ├─A0--为何
  6. ├─A01--有时
  7. ├─A012--学习
  8. ├─A013.1--感到
  9. ├─A02--很吃力
  10. ├─A023--是因为
  11. ├─A025.7--愚钝
  12. ├─A025.7.3--还是
  13. ├─A025.7.4--因为
  14. ├─A1--不够
  15. ├─A135--苍天
  16. ├─[A013]--批处理
  17. ├─[A13]--聪明
  18. ├─{A025}--资质
  19. └─{A135.6}--求解
复制代码
运行后
  1. :.
  2. ├─A-1
  3. │  └─A-1--批处理
  4. ├─A-2
  5. │  └─A-2--论坛
  6. ├─A-3
  7. │  └─A-3--求学
  8. ├─A0
  9. │  ├─A0--为何
  10. │  ├─A01
  11. │  │  ├─A01--有时
  12. │  │  ├─A012
  13. │  │  │  └─A012--学习
  14. │  │  └─A013
  15. │  │      ├─A013.1
  16. │  │      │  └─A013.1--感到
  17. │  │      └─[A013]--批处理
  18. │  └─A02
  19. │      ├─A02--很吃力
  20. │      ├─A023
  21. │      │  └─A023--是因为
  22. │      └─A025
  23. │          ├─A025.7
  24. │          │  ├─A025.7--愚钝
  25. │          │  ├─A025.7.3
  26. │          │  │  └─A025.7.3--还是
  27. │          │  └─A025.7.4
  28. │          │      └─A025.7.4--因为
  29. │          └─{A025}--资质
  30. └─A1
  31.     ├─A1--不够
  32.     └─A13
  33.         ├─A135
  34.         │  ├─A135--苍天
  35.         │  └─A135.6
  36.         │      └─{A135.6}--求解
  37.         └─[A13]--聪明
复制代码

TOP

回复 6# terse


    谢了,代码作为学习资料研究下,对于我来说,可以学到好多知识,但运行后与想要的文件夹树结构有些许出入,还是用TC操作吧。。

TOP

返回列表