Board logo

标题: [文件操作] 请问批处理如何随机从A目录复制文件到B目录? [打印本页]

作者: skyuser    时间: 2010-9-16 03:59     标题: 请问批处理如何随机从A目录复制文件到B目录?

比如:
我A目录有1000个文件.文件名各异,

为了防止按文件名首字母顺序提取,我需要随机提取复制200个文件到B目录,

请问这样的批处理怎么写?

感谢大家.万分感谢
作者: skyuser    时间: 2010-9-16 04:59

如果不随机的话 就会出现下图所示的 很多相同首字母的文件聚集在一起了!

谢谢解答!
作者: edmond    时间: 2010-9-16 15:13

随机提取,我想批处理取文本必然是有规律的吧,如何能够随即呢,最多是规律比较复杂.....期待牛人解答!
作者: edmond    时间: 2010-9-16 16:23

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,200) do (set /a n=!random! %% 1000
  4.      for /f "tokens=1* delims=:"  %%i in ('findstr /n ".*" A.txt') do (
  5.           if  %%i==!n! (echo %%j>>B.txt)
  6.         
  7.   )
  8. )
  9. pause
复制代码

作者: skyuser    时间: 2010-9-16 18:03

是这样子的 a目录有很多文件 我只是举例可能是1000个文件 其实是更多的 3000-1万个左右吧,没有具体数量的.

我只想做到从A文件夹随机复制指定数量的文件到B文件夹/

请问这个批处理如何写?再次感谢edmond 大哥的热心解答!谢谢
作者: edmond    时间: 2010-9-16 21:36

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. color 1f
  4. dir /b *.txt "D:\A\" >>tem.ini 2>nul
  5. echo 请输入你要拷贝的数量,按回车继续
  6. set /p s=
  7. echo 请输入你源文件盘的文件数量,按回车继续
  8. set /p r=
  9. for /l  %%a in (1,1,!s!) do (set /a n=!random! %% !r!
  10.    for /f "delims=: tokens=1*" %%i in ('findstr /n ".*" tem.ini') do (
  11.         if !n!==%%i  (copy /y D:\A\%%j  D:\B\)
  12.   )
  13. )
  14. cls
  15. del tem.ini
  16. pause
复制代码
目录要根据你的实际修改一下
作者: edmond    时间: 2010-9-16 21:41

如果文件不是全部 txt 就把 dir /b  *.txt  改成 dir /b *.*
作者: skyuser    时间: 2010-9-16 22:14

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. color 1f
  4. dir /b *.txt "D:\A\" >>tem.ini 2>nul
  5. echo 请输入你要拷贝的数量,按回车继续
  6. set /p s=
  7. echo 请输入你源文件盘的文件数量,按回车继续
  8. set /p r=
  9. for /l %%a in (1,1,!s!) do (set /a n=!random! %% !r!
  10. for /f "delims=: tokens=1*" %%i in ('findstr /n ".*" tem.ini') do (
  11. if !n!==%%i (copy /y D:\A\%%j D:\B\)
  12. )
  13. )
  14. cls
  15. del tem.ini
  16. pause
复制代码
现在可以用了,但复制的速度很慢,我一个源文件夹有6000多个文件 复制200个文件到到D:\B\ 花了将6分钟.

请问能否更高效的效率执行吗?
还有,复制过去之后,还得把源文件夹的文件删除才行,就相当于一个移动的过程.

最后非常感谢您的解答,解决了我多日的难题,谢谢!




[ 本帖最后由 skyuser 于 2010-9-16 22:17 编辑 ]
作者: 随风    时间: 2010-9-17 01:04

楼上代码快才是怪事,tem.ini 文件有6000行,光运行一次 findstr .* tem.ini  就够你受的了,更何况还要运行200次
还有,你上面的代码没对重复文件作判断啊,如果遇上随机数相同的话,岂不是复制的文件没有200个?
作者: skyuser    时间: 2010-9-17 01:34

确实如LS所说 我复制200个到B文件夹 实际上只有170多个文件 请问能帮我改善一下吗?谢谢.

还有最主要 已复制过的文件 就给他从源文件夹删除吧 谢谢!
作者: 随风    时间: 2010-9-17 01:38

请先备份源文件,测试成功后再正式运行
:
  1. @echo off
  2. set "lj=%cd%"
  3. cd/d D:\A\
  4. (for %%a in (*) do (
  5.    setlocal enabledelayedexpansion
  6.    echo !random!!random!!random! %%a
  7.    endlocal
  8. ))>"%lj%\tem"
  9. sort /+3 "%lj%\tem" /o "%lj%\tem.ini"
  10. del "%lj%\tem"
  11. echo 请输入你要拷贝的数量,按回车继续
  12. set /p s=
  13. for /f "usebackq tokens=1* delims= " %%a in ("%lj%\tem.ini") do (
  14.     set /a n+=1
  15.     set "wjm=%%b"
  16.     setlocal enabledelayedexpansion
  17.     if !N! gtr !s! goto end
  18.     move "!wjm!" "d:\b\"
  19.     endlocal
  20. )
  21. :end
  22. cd/d %lj%
  23. pause
复制代码

作者: skyuser    时间: 2010-9-17 02:13

感谢斑主熬夜为我解决问题,

现已完美解决,速度也很快! 赞一个!~~

非常感谢!!敬礼!!!
作者: edmond    时间: 2010-9-17 09:36

受教了!我也不过是初学者,不要如此打击吗!
作者: 随风    时间: 2010-9-17 11:35

re 13楼
不要误会,绝没有任何打击你的意思,只是指出8楼代码缺点,可能语气和用词不太恰当,抱歉!!
作者: TX_kakashi    时间: 2010-9-19 14:52

我也来练练手,无临时文件版。
  1. @echo off&setlocal enabledelayedexpansion
  2. set file_count=1
  3. set/p _folder=[请把你需要处理的文件夹拖放到此并按回车]:&echo.
  4. pushd %_folder%
  5. if exist random_file rd/s/q random_file
  6. md random_file
  7. set/p num_copy=请输入你想随机复制的文件数量:&echo.
  8. for /f "delims=" %%I in ('dir/b/s/a-d *.txt') do (
  9.      set my_random=!random!!random!
  10.      set "_file_!my_random!=%%I"
  11.    )
  12. echo -^>随机抽取文件中
  13. for /f "tokens=2 delims==" %%a in ('set _file') do (
  14.      copy "%%a" %_folder%\random_file\ >nul 2>nul
  15.      title [复制了!file_count!个文件]
  16.      if !file_count! geq %num_copy% goto copy_done
  17.      set /a file_count=!file_count!+1
  18.    )
  19. :copy_done
  20. echo.&echo 复制完毕.
  21. start %_folder%\random_file
  22. pause>nul
复制代码





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