Board logo

标题: [文本处理] 批处理复制时间段内的文件速度太慢 请大家解疑!!! [打印本页]

作者: iamstar    时间: 2009-10-9 09:41     标题: 批处理复制时间段内的文件速度太慢 请大家解疑!!!

  1. @echo off &setlocal enabledelayedexpansion
  2. set time1=
  3. set /p time1=起始时间(20090721)
  4. set time2=
  5. set /p time2=结束时间(20090723)
  6. md "C:\Documents and Settings\Administrator\桌面\p\%time2%"
  7. for /r \\192.168.1.3\p\123 %%a in (*.*) do (
  8. set var=%%~ta
  9. set var=!var:~0,4!!var:~5,2!!var:~8,2!
  10. echo dir /ta
  11. IF !VAR! GEQ !TIME1! IF !VAR! LEQ !TIME2! (
  12. xcopy "%%a" "C:\Documents and Settings\Administrator\桌面\p\%time2%")
  13. )
  14. if %errorlevel% == 0 echo OK
  15. if %errorlevel% == 1 echo NG
  16. pause
复制代码
  1. 第一个问题:
  2. 以上回显的返回值是否是FOR命令的返回值,我在运行过程中,复制成功还是失败都回显OK,例如:假设123文件内不存在时间段内的文件,运行命令回显OK。
  3. 但是把md创建文件夹的程序去掉,复制成功就显示OK,失败显示NG。例如:假设123文件内不存在时间段内的文件,运行命令回显NG。
  4. 希望看下有什么解决的方法。
复制代码
  1. 第二个问题:
  2. 还有就是运行过程中,速度特别慢。。是否是因为命令运行检索123文件夹内所有文件,来一一比对他们的日期是否在时间段内,在进行复制。
  3. 123文件夹内大约有10000个300K左右的文件,是否是造成运行过慢的原因。
  4. 是否还有其他复制时间段的方法,来解决复制时间过慢的问题。。
  5. 一个300K的文件用上面的批处理大约复制12秒,复制10000个大约33个小时,真的太慢啦。。。。希望高手帮忙看看。
复制代码
请高手帮忙写个程式,,要复制144个文件夹内的某个时间段创建的文件,每个文件夹内有100到10000个不等的大小约300K的文件,希望不会运行过慢。在线等

[ 本帖最后由 iamstar 于 2009-10-11 18:52 编辑 ]
作者: netbenton    时间: 2009-10-9 13:17

本帖最后由 pcl_test 于 2016-7-24 19:54 编辑

用到变量延迟,for内就应该用到!号

速度慢可能与同一进程内多线网络防问有关:
for在读取文件列表,并取文件建立时间,已经建立了网络传输,这时再插入xcopy,肯定义慢了。。。

改成如下,用临时文件:
  1. @echo off &setlocal enabledelayedexpansion
  2. set time1=
  3. set /p time1=起始时间(20090721)
  4. set time2=
  5. set /p time2=结束时间(20090723)
  6. md "C:\Documents and Settings\Administrator\桌面\p\%time2%"
  7. (for /r \\192.168.1.3\p\123 %%a in (*.*) do (
  8. set var=%%~ta
  9. set var=!var:~0,4!!var:~5,2!!var:~8,2!
  10. IF !VAR! GEQ !TIME1! IF !VAR! LEQ !TIME2! (echo %%a)
  11. ))>%temp%\%~n0.tmp
  12. rem 读取符合条件的文件
  13. for /f "tokens=*" %%a in (type "%temp%\%~n0.tmp") do (
  14.     echo dir /ta
  15.     xcopy "%%a" "C:\Documents and Settings\Administrator\桌面\p\%time2%"
  16. rem 复制,并显示状态,注意errorlevel 的%改成了!
  17.     if !errorlevel! equ 0 (echo OK) else ( echo NG)
  18. )
  19. pause
复制代码

作者: iamstar    时间: 2009-10-9 18:00     标题: 验证中

想这类复制时间段内的文件是否还有其他的方法,,就以上两种方法吗。。
作者: iamstar    时间: 2009-10-10 11:53     标题: 回复 2楼 的帖子

(type "%temp%\%~n0.tmp") 是不是应该加一个单引号改为(‘type "%temp%\%~n0.tmp"’) 。。。


2楼发表的帖子 复制过程也很慢,,
但是在直接通过网络路径复制,不用批处理 速度很快 ,有原因吗??
求一速度快一些的复制时间的德程式程式
作者: Batcher    时间: 2009-10-10 13:17     标题: 回复 4楼 的帖子

先用net use映射网络驱动器,再试试这样速度是否有所改善。
作者: netbenton    时间: 2009-10-10 13:33

re 4楼
对,是我漏掉了单引号

这样也慢吗?
是慢在取文件的日期上吧,
xcopy 应该不慢了吧?
作者: iamstar    时间: 2009-10-10 18:41     标题: 回复 6楼 的帖子

都很慢,去文件的时间大约有4分钟左右无反应,取文件结束后再复制文件,大约30秒才复制完一个300K的文件,慢!!!。单纯通过网络拷贝复制很快。。。
望各位大大帮帮忙,想一想是否还有其他的复制时间段的程式。。。急用。。。
作者: iamstar    时间: 2009-10-14 11:58     标题: 批处理复制时间段内的文件并根究返回值判断是否OK

  1. @echo off
  2. set t=%time%
  3. :line
  4. set line=
  5. set /p line=请输入线别(01~10):
  6. if not "%line%" == "01" if not "%line%" == "02" if not "%line%" == "03" if not "%line%" == "04" if not "%line%" == "05" if not "%line%" == "06" if not "%line%" == "07" goto a
  7. if "%line%" == "Q" exit cmd
  8. echo 线别Y%line%
  9. :pcnum
  10. set pcnum=
  11. set /p pcnum=请输入电脑编号(1~6):
  12. if not "%pcnum%" == "1" if not "%pcnum%" == "2" if not "%pcnum%" == "3" if not "%pcnum%" == "4" if not "%pcnum%" == "5" if not "%pcnum%" == "6" goto b
  13. if "%pcnum%" == "Q" exit cmd
  14. echo 电脑编号%pcnum%
  15. set aa=
  16. set /a aa=2*%pcnum%-1
  17. set bb=
  18. set /a bb=2*%pcnum%
  19. rem 一个电脑编号对应两个设备编号
  20. :data
  21. set data=
  22. set /p data=请输入拷贝文件的月份(200907):
  23. echo 拷贝文件月份%data%
  24. :disk
  25. set disk=
  26. set /p disk=请输入复制后文件的盘符(C~E):
  27. if not "%disk%" == "C" if not "%disk%" == "d" if not "%disk%" == "e" goto c
  28. echo 盘符 %disk%
  29. title  Y %line% L %pcnum%
  30. md %disk%:\WORK%data%\work%aa%
  31. md %disk%:\WORK%data%\work%bb%
  32. setlocal enabledelayedexpansion
  33. echo *********************%aa%*************************
  34. for /r \\Y%line%L%pcnum%\WORK%aa% %%a in (*.*) do (
  35. set var=%%~ta
  36. set var=!var:~0,4!!var:~5,2!
  37. IF !VAR! equ !data! xcopy "%%a" %disk%:\WORK%data%\work%aa%)
  38. if !errorlevel! equ 0 (echo OK) else (echo NG)
  39. echo ********************%bb%***********************
  40. for /r \\Y%line%L%pcnum%\WORK%bb% %%a in (*.*) do (
  41. set var=%%~ta
  42. set var=!var:~0,4!!var:~5,2!
  43. IF !VAR! equ !data! xcopy "%%a" %disk%:\WORK%data%\work%bb%)
  44. if !errorlevel! equ 0 (echo OK) else (echo NG)
  45. call :time0 "%t%" "%time%" "ok"
  46. echo.&echo 耗时: %ok%
  47. pause&exit
  48. :time0  以下为封装部分。
  49. :: code 随风 @bbs.bathone.cn 2008-08-15
  50. setlocal&set /a n=0
  51. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  52.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  53.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  54. )
  55. set "n=%n:-=%"
  56. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  57. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  58. endlocal&set "%~3=%ok%"&goto :eof
  59. pause
  60. :a
  61. echo 输入错误 & goto line
  62. :b
  63. echo 输入错误 & goto pcnum
  64. :c
  65. echo 输入错误 & goto disk
复制代码


问题一 :
无论是否复制成功 ,都回显Ok ???希望复制OK就是OK,复制错误就是NG。
问题二:
以上例子我只是拷贝了两个文件夹 。假如我有work1到WORK144个文件夹,不会要写144个for语句来拷贝吧。希望有没有简洁一些的表示方法。。我这个程式过于繁琐 ,希望帮忙简化一些代码
问题三:
由于是联网拷贝,如果文件过多,将会导致执行程式 的速度过慢。假如有10000个文件在里面找200907的复制出来 ,速度会很慢很慢。。希望可以修改一下 ,提高命令的效率。
问题四:
这个程式是复制修改日期之间的文件,希望修改一个复制创建日期之间的文件的程式。。我在论坛看了一些关于创建日期的帖子都使用dir /tc 希望解释一下到底怎么应用。
我是一个刚接触批处理的新手。这几天在看论坛的帖子,写了这么一个批处理,发现了很多问题,希望大家指正一下。。

[ 本帖最后由 iamstar 于 2009-10-14 12:13 编辑 ]
作者: iamstar    时间: 2009-10-15 18:38     标题: 复制

有没有人帮忙看下修改下这个程式。。




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