Board logo

标题: [文件操作] robocopy非常精准进度条,存在缺少,求完善 [打印本页]

作者: kzpichuli    时间: 2015-5-8 20:05     标题: robocopy非常精准进度条,存在缺少,求完善

本帖最后由 kzpichuli 于 2015-5-8 20:07 编辑
  1. @echo off
  2. mode con cols=70 lines=15
  3. title ★本命令复制文件和文件夹★
  4. setlocal enabledelayedexpansion
  5. ::=================================主程序1=================================
  6. :pk
  7. cls
  8. echo.
  9. echo.
  10. echo.
  11. echo             ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
  12. echo           ▕本命令复制文件和文件夹,速度快,重复的跳过▏
  13. echo             ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  14. echo.
  15. echo.
  16. echo  说明:某些系统需要把程序放到桌面上才能运行
  17. echo.
  18. set yes=3
  19. set yes2=0
  20. echo ★第一步★指定要复制的文件或者文件夹
  21. echo.
  22. set/p "file1=→→拖入要复制的文件夹:"
  23. if not defined file1 goto :pk
  24. set "pppp1=%file1:"=%"
  25. if "%pppp1%" equ " " goto :pk
  26. set "pppp1=%pppp1:&=^&%"
  27. set "file1="%pppp1%""
  28. echo.
  29. echo.
  30. if not exist %file1% goto :pk
  31. pushd %file1% 2>nul&&set yes=1||set yes=0
  32. popd
  33. if %yes% equ 1 (
  34. echo ■要复制的为■:文件夹-%file1%
  35. )
  36. if %yes% equ 0 (
  37. echo ■要复制的为■:文件-%file1%
  38. )
  39. ::=================================主程序2=================================
  40. :ak2
  41. echo.
  42. echo.
  43. echo ★第二步★指定要复制到哪里?
  44. echo.
  45. set/p "file2=→→拖入复制到何处:"
  46. set "pppp2=%file2:"=%"
  47. set "pppp2=%pppp2:&=^&%"
  48. set "file2="%pppp2%""
  49. pushd %file2% 2>nul&&set yes2=1
  50. popd  
  51. if %yes2% equ 0 echo 错误 &goto :ak2
  52. ::=================================主程序3=================================
  53. cls
  54. echo.
  55. echo  稍后,正在初始化……
  56. if %yes% equ 0 goto :bu2
  57. call :panduan
  58. start /min  /i cmd /c "(robocopy /e /ns /nc "%pppp1%" "%pppp2%" )"
  59. call :jindutiao
  60. echo 完成!&pause>nul
  61. exit
  62. :bu2
  63. set "route=%file1:"=%"
  64. call :fenli
  65. md "%route%\%filenamek%"
  66. move %file1% "%route%\%filenamek%"
  67. set "pppp=%route%\%filenamek%"
  68. set "pppp=%pppp:&=^&%"
  69. call :panduan
  70. start /min  /i cmd /c "(robocopy /e /ns /nc "%pppp%" "%pppp2%" )"
  71. call :jindutiao
  72. move "%route%\%filenamek%\%filename%" "%route%" 2>nul
  73. rd "%route%\%filenamek%" 2>nul
  74. echo 完成!&pause>nul
  75. exit
  76. goto :eof
  77. ::=================================路径提取名字和路径的程序=================================
  78. :fenli
  79. set filenamek=
  80. set filename=
  81. :separate2
  82. if not "%route:~-1%"=="\" (
  83.     set "filenamek=%route:~-1%%filenamek%"
  84.     set "route=%route:~0,-1%"
  85.     goto separate2
  86.     )
  87. set "route=%route:~0,-1%"
  88. set  "filename=%filenamek%"
  89. set  "filenamek=%filenamek:~0,-4%"
  90. goto :eof
  91. ::=================================判断robocopy程序=================================
  92. :panduan
  93. set /a numh=0
  94. set hand_0=0
  95. set hand_1=0
  96. set hand_2=0
  97. for /f "tokens=1,2* delims==" %%i in ('wmic process where name^="robocopy.exe" get Handle /value 2^>nul^|findstr "Handle" ') do (  
  98. set /a numh+=1
  99. set hand_!numh!=%%j  
  100. ) 2>nul
  101. goto :eof
  102. ::=================================进度条程序1-获取当前程序句柄=================================
  103. :jindutiao
  104. set hand=0
  105. for /f "tokens=1,2* delims==" %%i in ('wmic process where name^="robocopy.exe" get Handle /value 2^>nul^|findstr "Handle" ') do (  
  106. if %%j neq %hand_0% (
  107. if %%j neq %hand_1% (
  108. if %%j neq %hand_2% (
  109. set hand=%%j
  110. goto:out3
  111. )
  112. )
  113. )
  114. )
  115. :out3
  116. if %hand% equ 0 (cls&echo.&echo.&echo 警告!robocopy命令没有启动!任意键退出程序!&pause&goto :eof)
  117. ::=================================进度条程序2-初始化程序=================================
  118. mode con cols=60 lines=10
  119. color 1f
  120. set    jindu=
  121. set    daxiao=0000000
  122. set /a jindu1=0
  123. for /f "tokens=3" %%i in ('dir /a /s /-c %file1%^|findstr "个文件"') do (set daxiao2=%%i )
  124. set /a all=%daxiao2:~0,-6%
  125. set    daxiao=
  126. :begain2
  127. set daxiao=00
  128. set jindu=
  129. for /f "tokens=1,2* delims==" %%i in ('wmic process where Handle^="%hand%" get WriteTransferCount /value 2^>nul^|findstr "WriteTransferCount"') do (  
  130. set daxiao=%%j
  131. goto :outp
  132. ) 2>nul
  133. :outp
  134. if "%daxiao%" equ "00" (
  135. if %yes% equ 0 (
  136. move "%route%\%filenamek%\%filename%" "%route%"
  137. rd "%route%\%filenamek%"
  138. )
  139. echo 警告!robocopy命令已经关闭!是否已完成!
  140. pause>nul
  141. goto :eof
  142. )
  143. call :jisuan
  144. ::=================================进度条程序2-显示程序=================================
  145. for /l %%i in (0 5 %jindu1%) do (
  146. set "jindu=!jindu!▉"
  147. )
  148. title 进度:%jindu1%﹪
  149. cls
  150. echo                      Robocopy复制进度
  151. ECHO.
  152. echo 容量进度(M): %daxiao:~0,-1% / %all:~0,-1%
  153. echo.
  154. echo                        百分进度:%jindu1%﹪
  155. echo          ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
  156. echo          %jindu%  
  157. echo          ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  158. if %jindu1% gtr 95 color 4E
  159. timeout /t 1 1>nul
  160. if %jindu1% equ 100 (title 警告!&goto :eof)
  161. goto :begain2
  162. goto :eof
  163. ::=================================进度条程序3-计算进度程序=================================
  164. :jisuan
  165. set num=
  166. set dec_str=
  167. set /a daxiao=%daxiao:~0,-7%
  168. if "%daxiao%" equ "" set daxiao=1
  169. set input=%daxiao% %all% 2
  170. for /f "delims=" %%i in ("%input%") do call :count %%i
  171. goto :eof
  172. :count
  173. set /a int_str=%1/%2
  174. set /a mod=%1%%%2
  175. if %mod% equ 0 goto :hao
  176. :count_dec
  177. set mod=%mod%0
  178. if %mod% lss %2 (
  179.    set dec_str=!dec_str!0
  180.     goto count_dec
  181. ) else (
  182.     set /a dec=%mod%/%2
  183.     set dec_str=!dec_str!!dec!
  184.     set /a mod=%mod%%%%2
  185. )
  186. set /a num+=1
  187. if %mod% neq 0 if %num% lss 2 goto count_dec
  188. :hao
  189. if %int_str% geq 1 (set /a jindu1=100 &goto :eof)
  190. if "!dec_str:~0,1!" equ "0" (
  191. if "!dec_str:~1,1!" equ "0" (set /a jindu1=1 &goto:eof)
  192. set /a jindu1=!dec_str:~1,1!
  193. )
  194. set /a jindu1=!dec_str:~0,2!
  195. goto :eof
复制代码
朋友们好!
先简单的介绍下制作过程:公司经常处理文件,我嫌系统本身copy太慢,robocopy真的很棒,有时候copy速度达到200m/s,系统本身根本无法做到!希望高手完善,因为我是才接触批,我的知识已经封顶了!
但是复制大数据比如100g,看不见总体进度,总是不舒服,
一开始利用每秒dir出粘贴处的文件夹容量来计算,后来发现这样慢,而且存在一个很大的问题:比如复制一个10g的大文件,刚复制%1,粘贴处的文件就变成10g了,所以这样计算非常不准
后来想利用robocopy自带的输出文件百分比,一点一点的计算,发现不现实,偶然发现可以利用wmic命令找到robocopy的实时读取和写入数据容量,有了这个就可以准确地知道robocopy当前复制了多少数据,
所以就制作出来了,在网上查了很久,在这里也逛达很久,也许大家不需要这个功能,但是看到有朋友在问,所以我就拿出共同研究,希望有高手能将这个功能完善!
目前,我经常用该命令,发现一些现实问题:
1.进度条的问题
进度条无法到达100%,因为99%时,robocopy已经退出,
多个robocopy同时复制,存在错误
发现复制的过程中进度条有时候一闪,知道是计算数据出现错误,但是一闪而过,也不知道为什么
2.非要放在桌面才能运行
3。界面难看
4.设置的是拖入复制和粘贴目录,但是非要点击确定键
5.不知道为什么试验多次,进度非常准确,就是无法计算出复制速度和预计时间,这是我最纳闷的地方
需要robocopy加精准进度的朋友请你们拿回去研究,我太累了,知识太有限!研究好了,别忘了共享下!谢谢!




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