[20170425]實現磁碟檔案與U盤同步.txt

lfree發表於2017-04-25

[20170425]實現磁碟檔案與U盤同步.txt

--//工作需要實現磁碟檔案與U盤同步,也就是每天下班前拷貝磁碟檔案到U盤,而回到家再需要U盤檔案拷貝到本地磁碟,如此反覆。
--//隨著檔案越來越多,裡面都是很小的文字檔案,每次拷貝非常浪費時間,從以前幾分鐘到現在將近1X分鐘,越來越慢。

--//我以前的指令碼核心內容大致如下:
--// 說明 U:表示U盤, H:
--//in.bat U盤到本地磁碟
xcopy /d/e/y U:\blog\*.*  h:\blog

--//out.bat 本地磁碟到U盤
xcopy /d/e/y h:\blog\*.* U:\blog\*.*

--//實際上這樣僅僅修改更新的檔案才覆蓋,真正拷貝的檔案不是很多,隨著裡面檔案增加,磁碟與U盤對比浪費許多時間,越來越慢。
--//於是開始考慮別的解決方法:
--//許多站點提到了robocopy,我看了一下不是很合適。

--//找到如下連結:
blog.csdn.net/kk185800961/article/details/42194327

--//不過竟然使用xcopy  /EXCLUDE的排他模式,顯然這樣不是很科學,正常選擇拷貝檔案就OK了。
--//裡面提到了無法使用+在forfiles。實際上+支援日期模式:

R:\>forfiles  /?
...

示例:
    FORFILES /?
    FORFILES
    FORFILES /P C:\WINDOWS /S /M DNS*.*
    FORFILES /S /M *.txt /C "cmd /c type @file | more"
    FORFILES /P C:\ /S /M *.bat
    FORFILES /D -30 /M *.exe
             /C "cmd /c echo @path 0x09 在 30 前就被更改。"
    FORFILES /D 2001/01/01
             /C "cmd /c echo @fname 在 2001年1月1日就是新的。"
    FORFILES /D +2017/4/25 /C "cmd /c echo @fname 今天是新的。"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    FORFILES /M *.exe /D +1
    FORFILES /S /M *.doc /C "cmd /c echo @fsize"
    FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

--//注意看下劃線以及日期格式。
--//有了這些知識,就有了前面2篇blog,windows批處理指令碼真麻煩。
http://blog.itpub.net/267265/viewspace-2137952/
http://blog.itpub.net/267265/viewspace-2137957/

--//inx.bat U盤到本地磁碟
echo @echo on > d:\usb.bat
sleep 1
echo echo  start sync file from usb >> d:\usb.bat
sleep 1
echo h: >> d:\usb.bat
sleep 1
echo cd \blog >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat

rem xcopy /d/e/y *.* h:\blog\*.*
forfiles /p "U:\blog" /m * /s /d  +2017/04/24 /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat
rem forfiles /p "o:\blog" /m * /s /d  +%date:~0,10% /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat

sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
sleep 1
echo echo end sync >> d:\usb.bat
sleep 1
echo pause >> d:\usb.bat
pause
call d:\usb.bat

--//生成xcopy命令前加入管道,是因為如果是新檔案目的地沒有windows會提示是目錄還是檔案,正常選擇F,於是前面有了echo F。
--//另外為了輸出| ,前面必須加一個轉義符號^.昏,微軟的批處理指令碼語言真混亂。
--//如果輸出到檔案usb.bat的時間不適合可以自己改,我不想再寫了。

--//outx.bat 本地磁碟到U盤
echo @echo on > d:\usb.bat
sleep 1
echo echo  start sync file to usb >> d:\usb.bat
sleep 1
echo U: >> d:\usb.bat
sleep 1
echo cd \blog >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat

rem xcopy /d/e/y *.* h:\blog\*.*
sleep 1
forfiles /p "h:\blog" /m * /s /d  +%date:~0,10% /c "cmd /c if @isdir==FALSE echo echo F ^|  xcopy /d/e/y @path @relpath" >> d:\usb.bat

sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
sleep 1
echo echo end sync >> d:\usb.bat
sleep 1
echo pause >> d:\usb.bat
pause
call d:\usb.bat

--//這樣U盤拷貝到磁碟稍微慢一點,基本也在3-4分鐘解決問題。磁碟到U盤很快,基本1-2分鐘。

--//還有一些疑問windows指令碼如何獲取前一天的日期,不知道如何實現替換+%date:~0,10%
--//linux下可以使用
$  date --date='1 days ago' "+%Y/%m/%d"
2017/04/24

--//linux bash shell可以通過變數寫入,而windows批處理如何把命令的結果傳遞給變數呢?我想到僅僅是先將命令結果儲存到檔案,
--//在通過檔案傳遞給變數。 不熟悉windows放棄!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2137969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章