标题: [文件操作] 请问批处理如何随机从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
- @echo off
- setlocal enabledelayedexpansion
- for /l %%a in (1,1,200) do (set /a n=!random! %% 1000
- for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" A.txt') do (
- if %%i==!n! (echo %%j>>B.txt)
-
- )
-
- )
- pause
复制代码
作者: skyuser 时间: 2010-9-16 18:03
是这样子的 a目录有很多文件 我只是举例可能是1000个文件 其实是更多的 3000-1万个左右吧,没有具体数量的.
我只想做到从A文件夹随机复制指定数量的文件到B文件夹/
请问这个批处理如何写?再次感谢edmond 大哥的热心解答!谢谢
作者: edmond 时间: 2010-9-16 21:36
- @echo off
- setlocal enabledelayedexpansion
- color 1f
- dir /b *.txt "D:\A\" >>tem.ini 2>nul
- echo 请输入你要拷贝的数量,按回车继续
- set /p s=
- echo 请输入你源文件盘的文件数量,按回车继续
- set /p r=
- for /l %%a in (1,1,!s!) do (set /a n=!random! %% !r!
- for /f "delims=: tokens=1*" %%i in ('findstr /n ".*" tem.ini') do (
- if !n!==%%i (copy /y D:\A\%%j D:\B\)
- )
- )
- cls
- del tem.ini
- pause
复制代码
目录要根据你的实际修改一下
作者: edmond 时间: 2010-9-16 21:41
如果文件不是全部 txt 就把 dir /b *.txt 改成 dir /b *.*
作者: skyuser 时间: 2010-9-16 22:14
- @echo off
- setlocal enabledelayedexpansion
- color 1f
- dir /b *.txt "D:\A\" >>tem.ini 2>nul
- echo 请输入你要拷贝的数量,按回车继续
- set /p s=
- echo 请输入你源文件盘的文件数量,按回车继续
- set /p r=
- for /l %%a in (1,1,!s!) do (set /a n=!random! %% !r!
- for /f "delims=: tokens=1*" %%i in ('findstr /n ".*" tem.ini') do (
- if !n!==%%i (copy /y D:\A\%%j D:\B\)
- )
- )
- cls
- del tem.ini
- 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
请先备份源文件,测试成功后再正式运行
:- @echo off
- set "lj=%cd%"
- cd/d D:\A\
- (for %%a in (*) do (
- setlocal enabledelayedexpansion
- echo !random!!random!!random! %%a
- endlocal
- ))>"%lj%\tem"
- sort /+3 "%lj%\tem" /o "%lj%\tem.ini"
- del "%lj%\tem"
- echo 请输入你要拷贝的数量,按回车继续
- set /p s=
- for /f "usebackq tokens=1* delims= " %%a in ("%lj%\tem.ini") do (
- set /a n+=1
- set "wjm=%%b"
- setlocal enabledelayedexpansion
- if !N! gtr !s! goto end
- move "!wjm!" "d:\b\"
- endlocal
- )
- :end
- cd/d %lj%
- 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
我也来练练手,无临时文件版。- @echo off&setlocal enabledelayedexpansion
- set file_count=1
- set/p _folder=[请把你需要处理的文件夹拖放到此并按回车]:&echo.
- pushd %_folder%
- if exist random_file rd/s/q random_file
- md random_file
- set/p num_copy=请输入你想随机复制的文件数量:&echo.
- for /f "delims=" %%I in ('dir/b/s/a-d *.txt') do (
- set my_random=!random!!random!
- set "_file_!my_random!=%%I"
- )
- echo -^>随机抽取文件中
- for /f "tokens=2 delims==" %%a in ('set _file') do (
- copy "%%a" %_folder%\random_file\ >nul 2>nul
- title [复制了!file_count!个文件]
- if !file_count! geq %num_copy% goto copy_done
- set /a file_count=!file_count!+1
- )
- :copy_done
- echo.&echo 复制完毕.
- start %_folder%\random_file
- pause>nul
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |