Board logo

标题: [文件操作] 批处理如何按文件的字段值来新建文件夹以及移动文件夹? [打印本页]

作者: 304802301    时间: 2021-9-26 16:51     标题: 批处理如何按文件的字段值来新建文件夹以及移动文件夹?

求一个bat语句。。
实际情况,有2个文件夹,分别叫做“零散文件夹”和“目标文件夹”
1、“零散文件夹”里面有1000000个文件夹,文件夹名字无任何规律(比如某个文件夹名字叫ASDFGH)。
2、每个文件夹里面只有1个文件,文件名字也无规律,每个文件都是tf格式(比如文件名字叫330110.tf)。
3、tf文件可以用txt方式打开,都有一个Code字段和值,表达方式为Code="数字",每个tf文件里的Code值,可能一样,可能不一样,比如Code="231291011"
4、“目标文件夹”里面是空的
5、执行这个bat后,读取每个tf文件里面的Code字段和值(比如Code="231291011"),在“目标文件夹”里面新建一个文件夹,名字就是这个Code值(231291011),并把相同Code值的tf文件(330110.tf)连同其父文件夹(ASDFGH)一同剪切到这个文件夹里面来。


执行bat之前:
-1“零散文件夹”
     1.1、ASDFGH→330110.tf(Code="231291011")
     1.2、aksjdlqw→0980980.tf(Code="231291011")
     1.3、iojojoioqqq→00ooiiqq.tf(Code="2410909809")

-2“目标文件夹”
     空



=============================================

执行bat之后:

-1“零散文件夹”
     空

-2“目标文件夹”
    1.1、231291011
        1.1.1、ASDFGH→330110.tf
        1.1.2、aksjdlqw→0980980.tf
    1.2、2410909809
       1.2.1、iojojoioqqq→00ooiiqq.tf



具体的文件案例和详细的图片说明放在网盘上了
https://cowtransfer.com/s/99247a93f2e841
作者: idwma    时间: 2021-9-26 21:33

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r .\零散文件夹 %%a in (*.tf) do (
  4. for /f "tokens=1,5 delims== " %%b in (%%a) do (
  5. if "%%b"=="<ConstructProject" (
  6. set d=%%c
  7. md .\目标文件夹\!d:"=!
  8. move %%~dpa. .\目标文件夹\!d:"=!\
  9. )
  10. )
  11. )
  12. pause
复制代码

作者: taofan712    时间: 2021-9-29 10:42

  1. @echo off
  2. for /r 零散文件夹 %%a in (*.tf) do for /f  skip^=1^ tokens^=4^ delims^=^" %%i in (%%a) do for %%b in ("%%~dpa.") do xcopy 零散文件夹\%%~nxb 目标文件夹\%%i\%%~nxb\
  3. pause
复制代码

作者: qixiaobin0715    时间: 2021-9-29 14:05

本帖最后由 qixiaobin0715 于 2021-9-29 14:10 编辑

回复 1# 304802301
把批处理放在零散文件夹和目标文件夹同一目录中:
  1. @echo off
  2. set folder1=零散文件夹
  3. set folder2=目标文件夹
  4. cd %folder1%
  5. (for /f "delims=" %%i in ('dir /b /ad') do (
  6.     for /f "tokens=4,5 delims== " %%a in ('type "%%i\*.tf"') do (
  7.         if "%%a"=="Code" (
  8.             if not exist "%%~b" md "%%~b"
  9.             move "%%i" "%%~b"
  10.         )
  11.     )
  12. )
  13. for /d %%j in (*) do move "%%j" "%%~dpj..\%folder2%")>nul 2>nul
  14. pause
复制代码
按你的说法文件夹及文件较多,显示的信息进行了同一屏蔽。
作者: qixiaobin0715    时间: 2021-9-29 14:35

楼上代码多了一次移动,修改后效率要高一些:
  1. @echo off
  2. set folder1=零散文件夹
  3. set folder2=目标文件夹
  4. cd %folder1%
  5. (for /f "delims=" %%i in ('dir /b /ad') do (
  6.     for /f "tokens=4,5 delims== " %%a in ('type "%%i\*.tf"') do (
  7.         if "%%a"=="Code" (
  8.             if not exist "%%~dpi..\%folder2%\%%~b" md "%%~dpi..\%folder2%\%%~b"
  9.             move "%%i" "%%~dpi..\%folder2%\%%~b"
  10.         )
  11.     )
  12. ))>nul 2>nul
  13. pause
复制代码

作者: 304802301    时间: 2021-9-29 20:00

回复 5# qixiaobin0715


    大佬:有这个提示:
'er2' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
文件名、目录名或卷标语法不正确。
请按任意键继续. . .

另外有个情况:
1、文件格式不一定为tf,有时候会有其他格式
2、文件里面的code字段不一定在哪个位置上,可能在比较前面,也可能在比较后面的,但是一定会有Code="XXXXX"这个字段
作者: 304802301    时间: 2021-9-29 20:04

回复 2# idwma


    大佬:
1、文件格式不一定为tf,有时候会有其他格式
2、文件里面的code字段不一定在哪个位置上,可能在比较前面,也可能在比较后面的,但是一定会有Code="XXXXX"这个字段。我感觉你的代码里没有code字段。。。执行了之后发现部分文件是正确移动的,部分没有移动。。还在原地。。
作者: qixiaobin0715    时间: 2021-9-29 20:26

回复 6# 304802301
那是你自己没有说清楚,我是按你提供的文件测试的,我这里没有问题啊。代码不要手打,代码下面有“复制代码”的字样,点击后再粘贴到批处理文件,按你提供的文件试试是否还有问题。
然后把你的目录结构说清楚。
作者: qixiaobin0715    时间: 2021-10-1 09:14

本帖最后由 qixiaobin0715 于 2021-10-1 09:17 编辑

回复 6# 304802301
适用其它格式“文本”文件,每个文件夹中最好是只有一个文件且是文本文件,否则可能会出错。你提供的目录样本链接已失效,未经测试:
  1. @echo off
  2. set "folder1=零散文件夹"
  3. set "folder2=目标文件夹"
  4. setlocal enabledelayedexpansion
  5. cd "%folder1%"
  6. (for /f "delims=" %%i in ('dir /b /ad') do (
  7.     for /f "delims=" %%a in ('findstr "Code" "%%i\*.*"') do (
  8.         set "str=%%a"
  9.         set "str=!str:*Code=!"
  10.         for /f "delims== " %%b in ("!str!") do (
  11.             if not exist "%%~dpi..\%folder2%\%%~b" md "%%~dpi..\%folder2%\%%~b"
  12.             move "%%i" "%%~dpi..\%folder2%\%%~b"
  13.         )
  14.     )
  15. ))>nul 2>nul
  16. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2