
robocopy非常精準進度條存在缺少求完善最后由 kzpichuli 于 -5-8 20:07
朋友們好!先簡單的介紹下制作過程:公司經常處理文件,我嫌系統本身copy太慢,robocopy真的很棒,有時候copy速度達到200m/s,系統本身根本無法做到!希望高手完善,因為我是才接觸批,我的知識已經封頂了!但是復制大數據比如100g,看不見總體進度,總是不舒服,一開始利用每秒dir出粘貼處的文件夾容量來計算,后來發現這樣慢,而且存在一個很大的問題:比如復制一個10g的大文件,剛復制%1,粘貼處的文件就變成10g了,所以這樣計算非常不準后來想利用robocopy自帶的輸出文件百分比,一點一點的計算,發現不現實,偶然發現可以利用wmic命令找到robocopy的實時讀取和寫入數據容量,有了這個就可以準確地知道robocopy當前復制了多少數據,所以就制作出來了,在網上查了很久,在這里也逛達很久,也許大家不需要這個功能,但是看到有朋友在問,所以我就拿出共同研究,希望有高手能將這個功能完善!目前,我經常用該命令,發現一些現實問題:1.進度條的問題進度條無法到達100%,因為99%時,robocopy已經退出,多個robocopy同時復制,存在錯誤發現復制的過程中進度條有時候一閃,知道是計算數據出現錯誤,但是一閃而過,也不知道為什么2.非要放在桌面才能運行3。界面難看4.設置的是拖入復制和粘貼目錄,但是非要點擊確定鍵5.不知道為什么試驗多次,進度非常準確,就是無法計算出復制速度和預計時間,這是我最納悶的地方需要robocopy加精準進度的朋友請你們拿回去研究,我太累了,知識太有限!研究好了,別忘了共享下!謝謝!nclick="copycode($('code0'));">復制代碼
- @echo off
- mode con cols=70 lines=15
- title ★本命令復制文件和文件夾★
- setlocal enabledelayedexpansion
- ::=================================主程序1=================================
- :pk
- cls
- echo.
- echo.
- echo.
- echo ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
- echo ▕本命令復制文件和文件夾,速度快,重復的跳過▏
- echo ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- echo.
- echo.
- echo說明:某些系統需要把程序放到桌面上才能運行
- echo.
- set yes=3
- set yes2=0
- echo ★第一步★指定要復制的文件或者文件夾
- echo.
- set/p file1=→→拖入要復制的文件夾:
- if not defined file1 goto :pk
- set pppp1=%file1:=%
- if %pppp1% equ goto :pk
- set pppp1=%pppp1:&=^&%
- set file1=%pppp1%
- echo.
- echo.
- if not exist %file1% goto :pk
- pushd %file1% 2>nul&&set yes=1||set yes=0
- popd
- if %yes% equ 1 (
- echo ■要復制的為■:文件夾-%file1%
- )
- if %yes% equ 0 (
- echo ■要復制的為■:文件-%file1%
- )
- ::=================================主程序2=================================
- :ak2
- echo.
- echo.
- echo ★第二步★指定要復制到哪里?
- echo.
- set/p file2=→→拖入復制到何處:
- set pppp2=%file2:=%
- set pppp2=%pppp2:&=^&%
- set file2=%pppp2%
- pushd %file2% 2>nul&&set yes2=1
- popd
- if %yes2% equ 0 echo 錯誤 &goto :ak2
- ::=================================主程序3=================================
- cls
- echo.
- echo稍后,正在初始化……
- if %yes% equ 0 goto :bu2
- call :panduan
- start /min/i cmd /c (robocopy /e /ns /nc %pppp1% %pppp2% )
- call :jindutiao
- echo 完成!&pause>nul
- exit
- :bu2
- set route=%file1:=%
- call :fenli
- md %route%%filenamek%
- move %file1% %route%%filenamek%
- set pppp=%route%%filenamek%
- set pppp=%pppp:&=^&%
- call :panduan
- start /min/i cmd /c (robocopy /e /ns /nc %pppp% %pppp2% )
- call :jindutiao
- move %route%%filenamek%%filename% %route% 2>nul
- rd %route%%filenamek% 2>nul
- echo 完成!&pause>nul
- exit
- goto :eof
- ::=================================路徑提取名字和路徑的程序=================================
- :fenli
- set filenamek=
- set filename=
- :separate2
- if not %route:~-1%== (
- set filenamek=%route:~-1%%filenamek%
- set route=%route:~0,-1%
- goto separate2
- )
- set route=%route:~0,-1%
- setfilename=%filenamek%
- setfilenamek=%filenamek:~0,-4%
- goto :eof
- ::=================================判斷robocopy程序=================================
- :panduan
- set /a numh=0
- set hand_0=0
- set hand_1=0
- set hand_2=0
- for /f tokens=1,2* delims== %%i in ('wmic process where name^=robocopy.exe get Handle /value 2^>nul^|findstr Handle ') do (
- set /a numh+=1
- set hand_!numh!=%%j
- ) 2>nul
- goto :eof
- ::=================================進度條程序1-獲取當前程序句柄=================================
- :jindutiao
- set hand=0
- for /f tokens=1,2* delims== %%i in ('wmic process where name^=robocopy.exe get Handle /value 2^>nul^|findstr Handle ') do (
- if %%j neq %hand_0% (
- if %%j neq %hand_1% (
- if %%j neq %hand_2% (
- set hand=%%j
- goto:out3
- )
- )
- )
- )
- :out3
- if %hand% equ 0 (cls&echo.&echo.&echo 警告!robocopy命令沒有啟動!任意鍵退出程序!&pause&goto :eof)
- ::=================================進度條程序2-初始化程序=================================
- mode con cols=60 lines=10
- color 1f
- setjindu=
- setdaxiao=0000000
- set /a jindu1=0
- for /f tokens=3 %%i in ('dir /a /s /-c %file1%^|findstr 個文件') do (set daxiao2=%%i )
- set /a all=%daxiao2:~0,-6%
- setdaxiao=
- :begain2
- set daxiao=00
- set jindu=
- for /f tokens=1,2* delims== %%i in ('wmic process where Handle^=%hand% get WriteTransferCount /value 2^>nul^|findstr WriteTransferCount') do (
- set daxiao=%%j
- goto :outp
- ) 2>nul
- :outp
- if %daxiao% equ 00 (
- if %yes% equ 0 (
- move %route%%filenamek%%filename% %route%
- rd %route%%filenamek%
- )
- echo 警告!robocopy命令已經關閉!是否已完成!
- pause>nul
- goto :eof
- )
- call :jisuan
- ::=================================進度條程序2-顯示程序=================================
- for /l %%i in (0 5 %jindu1%) do (
- set jindu=!jindu!▉
- )
- title 進度:%jindu1%﹪
- cls
- echoRobocopy復制進度
- ECHO.
- echo 容量進度(M): %daxiao:~0,-1% / %all:~0,-1%
- echo.
- echo百分進度:%jindu1%﹪
- echo▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
- echo%jindu%
- echo▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- if %jindu1% gtr 95 color 4E
- timeout /t 1 1>nul
- if %jindu1% equ 100 (title 警告!&goto :eof)
- goto :begain2
- goto :eof
- ::=================================進度條程序3-計算進度程序=================================
- :jisuan
- set num=
- set dec_str=
- set /a daxiao=%daxiao:~0,-7%
- if %daxiao% equ set daxiao=1
- set input=%daxiao% %all% 2
- for /f delims= %%i in (%input%) do call :count %%i
- goto :eof
- :count
- set /a int_str=%1/%2
- set /a mod=%1%%%2
- if %mod% equ 0 goto :hao
- :count_dec
- set mod=%mod%0
- if %mod% lss %2 (
- set dec_str=!dec_str!0
- goto count_dec
- ) else (
- set /a dec=%mod%/%2
- set dec_str=!dec_str!!dec!
- set /a mod=%mod%%%%2
- )
- set /a num+=1
- if %mod% neq 0 if %num% lss 2 goto count_dec
- :hao
- if %int_str% geq 1 (set /a jindu1=100 &goto :eof)
- if !dec_str:~0,1! equ 0 (
- if !dec_str:~1,1! equ 0 (set /a jindu1=1 &goto:eof)
- set /a jindu1=!dec_str:~1,1!
- )
- set /a jindu1=!dec_str:~0,2!
- goto :eof

