Board logo

标题: [文件操作] 批处理如何将不同文件夹下的文件随机复制到另外的文件夹中? [打印本页]

作者: boyuboyu    时间: 2010-9-30 17:33     标题: 批处理如何将不同文件夹下的文件随机复制到另外的文件夹中?

如何将不同文件夹下的文件随机复制其中的一个到另外的文件夹中,比如在“D:\作业”文件夹里有几组作业“语文作业、数学作业、英语作业……”文件夹,在这些文件夹里分别有几个作业文件语文1.doc、语文2.doc、语文3.doc……”;在“D:\学生名单”文件夹里有以学生名字命名的文件夹。请问可以利用批处理,将这些作业文件分别随机复制其中的一个文件到学生名字命名的文件夹中吗?(在每个学生名字命名的文件夹中分别显示有“语文1、数学3、英语6……”等随机抽取的作业文件)请高手帮忙!
作者: Batcher    时间: 2010-9-30 17:49

每门作业文件分别有几个?或者个数不确定?
作者: boyuboyu    时间: 2010-9-30 21:13

总共有五门作业,每门作业文件都是20个,个数都一样,但是学生文件夹就有很多了,大概一千多个吧

[ 本帖最后由 boyuboyu 于 2010-9-30 21:15 编辑 ]
作者: boyuboyu    时间: 2010-10-1 08:15

今天国庆,祝大家假期愉快!
作者: cjiabing    时间: 2010-10-1 13:36     标题: 楼主你有福了

注意:
1、以下“生成作业”仅用于试验,不要和你的真实文件放在一起,否则毁了你的作业就麻烦了。
2、“布置作业”内的科目可以修改,最好用记事本的“替换”来修改。
生成作业:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (语文 数学 英语 政治 历史) do (
  3. if not exist "%%a作业" md "%%a作业"&&for /l %%i in (0,1,20) do cd.>%%a作业\%%a%%i.doc
  4. )
复制代码
学生名单.txt
  1. 张三
  2. 李四
  3. 爱因斯坦
  4. 麻花卷
  5. 犀利哥
复制代码
布置作业:
  1. @echo off&setlocal enabledelayedexpansion
  2. :a
  3. cls
  4. for /f %%i in (学生名单.txt) do (
  5. echo %%i:
  6. if not exist 学生名单\%%i md 学生名单\%%i
  7. for %%a in (语文 数学 英语 政治 历史) do (
  8. set /a var=!time:~-1,1!+!random:~-1,1!
  9. if exist %%a作业\%%a!var!.doc  copy  %%a作业\%%a!var!.doc 学生名单\%%i
  10. )
  11. )
  12. pause
  13. goto a
复制代码

目前可能存在问题:
1、有时可能无法完整抽题——很少出现;2、只能抽0~18道题——针对你目前的题数,可以修改扩大;
顺便赠送你一个获取学生名单的:
  1. @echo off
  2. cd.>学生名单.txt
  3. for /d %%a in (*) do echo %%a>>学生名单.txt
  4. ::注意:是获取当前目录下的文件夹,并将文件夹名单写入“学生名单.txt”,请注意检查文件夹名称是否学生名字。
  5. pause
复制代码

[ 本帖最后由 cjiabing 于 2010-10-1 16:58 编辑 ]
作者: boyuboyu    时间: 2010-10-1 15:37

先谢谢5楼的大师!
有个问题,怎么有的学生文件夹下复制有3个文件,有的文件下复制4个文件,有的5个,怎么样能让每个学生文件夹下都有5个文件啊!!谢谢!!

[ 本帖最后由 boyuboyu 于 2010-10-1 16:10 编辑 ]
作者: cjiabing    时间: 2010-10-1 16:31     标题: 回复 6楼 的帖子

——“获取学生名单”的程序其实是获取文件夹名称,它会搜索批处理所在目录下所有的文件夹名称。提供给你是怕你已经建立以学生名字命名的文件夹了,这样就可以获得所有这些文件夹的名称,将它们写入“学生名单”的文本里供后面使用。当然你也可以自己编写名单。
——“布置作业”这个批处理所在的目录:把它和语文作业、数学作业、英语作业、历史作业、政治作业五个文件夹放到一起——在同一目录下。名为“学生名单”的文件夹和文本也应当放到该目录下。“学生名单”文件夹里是以学生名字命名的文件夹。
——复制文件不够5个的问题,可能是你的执行环境和我的不同,也就是我这里是模拟试验的,你的是实际应用,不好讨论。代码本身很少时候会出现此情况,我这里只出现过一两次,可能与“%var%”有关。因为%var%是两个自然数个位数的和,最小是0+0=0,最大是9+9=18。又因为可能没有以“0”来命名文件,如“语文0.doc”、“数学0.doc”,因此代码判断不存在该文件就没显示。解决的方法是将作业含有“20”的改成“0”,如将“英语20.doc”改成“英语0.doc”。——没办法,这个代码只能这样,另外想点其他思路吧。

[ 本帖最后由 cjiabing 于 2010-10-1 16:41 编辑 ]
作者: powerbat    时间: 2010-10-1 16:50

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set "job=D:\作业"
  4. set "stu=D:\学生名单"
  5. set num=20
  6. for /d %%a in ("%stu%\*") do for /d %%i in ("%job%\*") do (
  7.     set subject=%%~ni
  8.     set subject=!subject:~,-2!
  9.     set /a x=!random! %% num + 1
  10.     echo copy "%%i\!subject!!x!.doc" "%%a"
  11. )
  12. pause
复制代码

作者: boyuboyu    时间: 2010-10-1 18:46     标题: 回复 8楼 的帖子

谢谢8搂的高手!也再次感谢5楼的高手。
我明天去试试,不管结果如何,都谢谢各位高手的指点!
作者: boyuboyu    时间: 2010-10-3 09:20

原帖由 powerbat 于 2010-10-1 16:50 发表
@echo off
setlocal enableDelayedExpansion
set "job=D:\作业"
set "stu=D:\学生名单"
set num=20
for /d %%a in ("%stu%\*") do for /d %%i in ("%job%\*") do (
    set subject=%%~ni
    set subject=!s ...


这段代码执行后,并没有复制文件啊!
作者: Batcher    时间: 2010-10-3 12:12     标题: 回复 9楼 的帖子

那是一段显示代码,你把copy前面的echo删掉就行了。




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