Board logo

标题: [文件操作] 批处理如何批量将多个文件按指定数量分配到多个文件夹里 [打印本页]

作者: 33453506    时间: 2012-2-23 11:31     标题: 批处理如何批量将多个文件按指定数量分配到多个文件夹里

本帖最后由 pcl_test 于 2016-7-22 22:45 编辑

规则说明:

  把当前目录里面所有的文件分配在新建立的文件夹内

  自动新建立文件夹,自动筛选18个文件(或更多文件,最好可以自定义)导入在新建的文件夹内

  如果当前目录里面有180个文件,那么就自动建立10个文件夹,并且每个文件夹精确导入18个文件即可

  有没有大神可以写个批处理搞定的?小弟感激不禁啊!
作者: cjiabing    时间: 2012-2-23 11:48

你的意思是不是“自动建立新文件夹并将当前目录所有文件分配到新建文件夹中每个文件夹分到18个?”
作者: 33453506    时间: 2012-2-23 11:49

对对对,版主大神,就是这个意思!!!!!!在线等您答复!
作者: cjiabing    时间: 2012-2-23 13:05

本帖最后由 cjiabing 于 2012-2-23 13:11 编辑

回复 3# 33453506
代码有点复杂,可能没空弄,我在弄其他事情。提供点思路:
1、获得当前目录层所有文件 dir /b *.*    文件夹不算在内。文件的个数统计办法,边搜索边统计可以用set /a num+=1,我更习惯在事后用findstr /n。
2、如何分配18个?你可以使用十八的倍数来判断,这个稍微难点。
  1. @echo off&setlocal enabledelayedexpansion
  2. ::设置要建立的文件夹顺序,Newp.txt是当前目录的所有文件。
  3. cd.>Newp.txt
  4. dir /b *.*>>Newp.txt
  5. set newf=0
  6. set num=0
  7. md New0
  8. for /f "tokens=*" %%a in (Newp.txt) do (
  9.     if !num! == 18 set num=0&set /a newf+=1&md New!newf!
  10.     copy %%a New!newf!&set /a num+=1
  11. )
复制代码

————————————————————
我自己试了下,不能直接用dir,先转个txt。
作者: 33453506    时间: 2012-2-23 13:14

确实是不会呀,大神,帮帮忙吧!!!!!
作者: Perl    时间: 2012-2-23 13:15

如果有170个文件,那么自动建立几个文件夹,并且每个文件夹精确导入几个文件?
作者: Perl    时间: 2012-2-23 13:18

回复 4# cjiabing


为什么不能直接用dir?
如果要排除文件夹,可以用:
  1. dir /b /a-d
复制代码

作者: cjiabing    时间: 2012-2-23 13:53

本帖最后由 cjiabing 于 2012-2-23 13:54 编辑

回复 7# Perl


    为什么用txt你试试看就知道了。不想想太多,完成任务即可。
    呵呵,没用过“-”,谢谢提醒。
作者: 33453506    时间: 2012-2-23 16:09

谢谢版主大神,已经搞定了!哇哈哈哈!!!!!!!!!!!!!!!
作者: Perl    时间: 2012-2-23 21:16

回复 4# cjiabing


cd.>Newp.txt
dir /b *.*>>Newp.txt
这种写法是何用意?

为什么不直接:
dir /b *.*>Newp.txt
作者: Perl    时间: 2012-2-23 21:36

回复 8# cjiabing


为什么不用txt,你多学学就知道了
作者: Perl    时间: 2012-2-23 21:37

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set fileNum=5
  4. set fileID=0
  5. set folderPre=MyFolder
  6. set folderSuf=0
  7. for /f "delims=" %%a in ('dir /b /a-d') do (
  8.     set /a mod=!fileID! %% %fileNum%
  9.     if "!mod!" == "0" (
  10.         set /a folderSuf+=1
  11.         md "%folderPre%_!folderSuf!"
  12.     )
  13.     set /a fileID+=1
  14.     copy "%%a" "%folderPre%_!folderSuf!\"
  15. )
复制代码

作者: cjiabing    时间: 2012-2-23 23:34

回复 12# Perl


    哥,你写的比我复杂呢!~

cd.>Newp.txt
dir /b *.*>>Newp.txt
这种写法是何用意?
————cd.>Newp.txt,这种写法是为了清空该文本文件,创建0字节文件,防止下次写入时重复读取上次文件的结果。所以,写代码要考虑重复使用的特性。
————如果你不使用的话,你重复几次运行就知道了。它的作用意义类似于del Newp.txt。

为什么不直接:
dir /b *.*>Newp.txt
————我原来是直接 for /f %%a in ('dir /b *.*') do echo;%%a  的。文件夹内只有21个文件,但结果却是在新创建的每个文件夹都塞满18个文件,那就意味着echo:%%a的值不是一次一个,而是一次一堆。
————因为不想过多纠缠于此,采用临时文件Newp.txt的办法转了一下,达到目标就行,不必太过计较。

    当然,如果你想知道为什么,你可以测试,以你的测试为准。因为我写整个代码只测试了两次,一次错误,一次正确,正确率只有50%以下。
作者: Perl    时间: 2012-2-24 00:27

回复 13# cjiabing


请教一下12楼和4楼相比,复杂在什么地方?
作者: Perl    时间: 2012-2-24 00:32

回复 13# cjiabing


10楼的疑问并不是说临时文件和for /f + dir
而是说,为何不把cd+dir >>合并成dir >
作者: cjiabing    时间: 2012-2-24 03:23

回复 15# Perl

    人比较笨没办法!~
    你学得蛮细的嘛~!我习惯了这种传统的做工,所以没法去了解dir>txt这样也得,佩服兄了!~
作者: terse    时间: 2012-2-24 19:29

不知道这个18在这里是随机的还是固定的
  1. @echo off&setlocal enabledelayedexpansion
  2. set M=18
  3. for /f "delims=" %%i in ('dir /b /a-d *.*') do (
  4.     set /a Num=N/M,D=N%%M,N+=1
  5.     if !D! EQU 0 MD "New_!Num!" 2>NUL
  6.     copy "%%i"  "New_!Num!" >NUL
  7. )
  8. pause
复制代码

作者: 523066680    时间: 2012-2-24 19:55

回复 13# cjiabing


    他那个for好像会把批处理也复制进去吧……
filetest>dir *.bat  /s /b
filetest\fo.bat
filetest\test.bat
filetest\test2.bat
filetest\MyFolder_21\fo.bat
filetest\MyFolder_21\test.bat
filetest\MyFolder_21\test2.bat

jiabing的文件列表选在了文本里,避开了这个问题。
作者: terse    时间: 2012-2-24 20:13

回复  cjiabing


    他那个for好像会把批处理也复制进去吧……
filetest>dir *.bat  /s /b
filetes ...
523066680 发表于 2012-2-24 19:55

看前面代码 应该没避开哦
本应添加 IF "%%i" neq "%~nx0" 的  即可
作者: 523066680    时间: 2012-2-24 20:16

本帖最后由 523066680 于 2012-2-24 20:35 编辑

回复 19# terse


恩,也可以  dir 的时候 ^|find /v "%~nx0"
还可以选择把批处理放在文件夹外部~  不过,还是看楼主具体要求了。也许批处理本身进去也无所谓

今晚真热闹


也写了,不见得好
  1. @echo off &setlocal enabledelayedexpansion
  2. set /a n=18,folder=0
  3. for /f "tokens=*" %%a in ('dir /b /a-d * ^|find /v "%~nx0"') do (
  4. if !n! lss 18 (
  5. set /a n+=1
  6. ) else (
  7. set /a n=1,folder+=1
  8. md fold_!folder!
  9. )
  10. copy "%%a" fold_!folder!\
  11. )
  12. pause
复制代码

作者: cjiabing    时间: 2012-2-24 20:57

回复 20# 523066680


    看官,那是昨晚的事情了!~
    昨晚的代码比较潦草些,现在修改完善如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. ::文件分类管理:按每18个文件装进一个文件夹整理。
  3. echo;&echo;    开始整理……&echo;
  4. set newf=0
  5. set numf=0
  6. set conf=0
  7. if not exist New!newf! md New!newf!
  8. for /f "tokens=*" %%a in ('dir /b /a-d') do (
  9.     if !numf! geq 18 set numf=0&set /a newf+=1&md New!newf!
  10.     if not "%%~na"=="%~n0" copy "%%~a" New!newf!&set /a numf+=1
  11.     set /a conf=!newf!*18+!numf!
  12. )
  13. echo;&echo;    整理完成,共 !conf! 个文件,请注意检查!&pause>nul
复制代码





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