iT邦幫忙

1

bat檔案比對加備份

zp145 2017-07-04 17:08:1816341 瀏覽
  • 分享至 

  • xImage

請教各位大大,小弟有寫個batch,要做檔案掃描比對及備份,不過還有部分不太懂得要如何撰寫,請大大指導一下。
環境:Windwos Server

因掃瞄出的檔案,希望能按照它原來的完整路徑(包含所在磁區),進行備份,所以我先在C:\底下建立已電腦名稱命名的目錄,在此目錄下在建立各硬碟槽的的資料夾。系統上有多顆硬碟,皆需比對掃描,所以我先掃瞄出磁碟代號有哪些。

問題:目前已掃瞄出清單內的檔案在那些地方,可參考"比對到的清單路徑Log"這張圖片,
請問我該如何依照檔案路徑,移動這些檔案(來源端不留檔案,或是copy後刪除來源端檔
案也可以)到C:%COMPUTERNAME%*。

 Ex1:"C:\Users\Administrator\Trend Micro Admin\zip\CoFTP\Tasks\At1.xml"要 
      copy到C:\%COMPUTERNAME%\C\Users\Administrator\Trend Micro 
      Admin\zip\CoFTP\Tasks\At1.xml
 
 Ex2:"E:\Trend Micro E\zip\CoFTP\Windows\PSEXESVC.EXE" 要Copy到
      C:\%COMPUTERNAME%\E\Trend Micro E\zip\CoFTP\Windows\PSEXESVC.EXE
 

第一步先執行此bat,

REM在C:\底下建立備份目錄(電腦名稱)
For /f "tokens=2 delims==" %%n in ('set^|find /I "COMPUTERNAME"') DO echo F | md C:\%%n

第二步在執行此bat

REM 設定備份目錄(電腦名稱)為變數,接著執行第3個bat

Set dst_folder=C:\%COMPUTERNAME%


REM讀取目前現有哪些磁碟槽代號
For %%p in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do @if exist %%p: echo %%p:>>.\Path\DrivesPath_%date:~0,4%%date:~5,2%.txt

REM再備份目錄下建立以磁碟代號為名稱的目錄
For /f " delims=:*" %%a in (.\Path\DrivesPath_%date:~0,4%%date:~5,2%.txt) do md %dst_folder%\%%a

start 3.Check_List.bat

第三步

REM 取得掃描磁區代號,並用清單內名稱去搜尋該檔案實際位置,並寫出Log

for /f %%c in (.\Path\DrivesPath_%date:~0,4%%date:~5,2%.txt) do (

   for /f %%a in (.\Virus\list.txt) do (forfiles /p %vDisk%\  /s /m %%a /c "cmd /c echo @path")
) >> .\Log\CheckList_%date:~0,4%%date:~5,2%.txt

目錄架構
1.要備份到的Tage目錄
http://ithelp.ithome.com.tw/upload/images/20170704/20075894tyDTAcXy1a.png

2.bat執行目錄
http://ithelp.ithome.com.tw/upload/images/20170704/20075894OpcOSw4v2b.png

3.掃描比對清單
http://ithelp.ithome.com.tw/upload/images/20170704/200758946Ka7mBs1vj.png

4.磁區代號清單
http://ithelp.ithome.com.tw/upload/images/20170704/20075894vXVztU66E9.png

5.比對到的清單路徑Log
http://ithelp.ithome.com.tw/upload/images/20170704/20075894Z0B5FDMiIk.png

6.目前在測試robocopy語法


set dst_folder=C:\WIN2K8R2-TEMP
setlocal enabledelayedexpansion

for /f %%c in (.\Path\DrivesPath_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt) do (
   		   
      set vDevice="%%c"
      			  
		 for /f %%a in (.\Virus\list.txt) do echo f | (dir !vDevice! /s /a-d /b /o:n | find /v /i "%%a") |  robocopy !vDevice! "%dst_folder%" /E /TS /FP /LOG+:.\Log\CopyListT_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
		   
		) >> .\Log\CopyListT2_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
看更多先前的討論...收起先前的討論...
小成 iT邦高手 10 級 ‧ 2017-07-05 08:41:59 檢舉
感覺你這麼做loading會很重,一個檔案就要全部掃一次,第二個檔案又要全部掃一次。

試試用ROBOCOPY,你的需求應該這樣就行了

robocopy [來源] [目的] [要複製的檔名1] [要複製的檔名2] [要複製的檔名3...] /S /MOV

如果要紀錄就再加 /UNILOG+:file
zp145 iT邦新手 5 級 ‧ 2017-07-05 10:57:02 檢舉
感謝兩位大大回覆,我目前copy方式是用robocopy,不會有前面幾個動作是因為我只會有檔名的清單,那符合這清單名稱檔案在哪顆磁碟底下的目錄,我不會知道,所以我依據清單去掃描。
掃出來建立清單後,我用For /F去讀這txt檔,再進行Robocopy,不過這段執行時會卡在路徑有空白,導致我後面無法執行。
Txt內文會像是這樣"C:\Program Files\CoFTP\Tasks_\At1.xml",不過bat跑完讀出的Log都會顯示"C:\Program後面就斷掉了,想請教一下有沒有解法?

我目前在測試的語法,寫在第6. ,.\Path\DrivesPath_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt這段就是我掃出來的檔案完整路徑
小成 iT邦高手 10 級 ‧ 2017-07-05 11:07:59 檢舉
會斷掉要用雙引號包起來,你!vDevice!沒包
然後你用FOR跑清單一個個檔名跑,會掃好幾次,我覺得LOADING過重,
你這個清單怎出來的? 他是用斷行來分隔檔名? 你要不要先處理那個清單成一行,然後然後再塞進 robocopy 去跑?
小成 iT邦高手 10 級 ‧ 2017-07-05 11:52:53 檢舉
另外你不是要刪除來源檔案嗎? 記得加參數 /MOV
zp145 iT邦新手 5 級 ‧ 2017-07-09 22:54:51 檢舉
謝謝小成大大,在測試時路徑都有加上雙引號來包,不過後來找到我的問題為for /f %%a in (.\Virus\list.txt) do這段沒有用delims=***去把預設的分隔符號改掉,導致我包的路徑會備擷掉。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
蟹老闆
iT邦大師 1 級 ‧ 2017-07-06 01:48:14
最佳解答

看看合不合用

@Echo Off
SetLocal ENABLEDELAYEDEXPANSION
Set Folder=D:\Temp&Rem 設定備份路徑,結尾不加 "\"
Set List=List.txt
Del /Q Dir.txt 0 1 2>nul
For /f "Skip=2 Delims=,: Tokens=2" %%i In ('WMIC LogicalDisk Where "DriveType=3" Get DeviceID /Format:Csv') Do 	Dir /b /s %%i:\ >Dir.txt
For /f %%j In (%List%) Do (
	For /f "Tokens=*" %%k In ('Findstr /C:"\%%j" /E "Dir.txt"') Do (
		Set Disk=%%~dk
		Xcopy /Y "%%~k" "%Folder%\!Disk::=!%%~pk"
		Del /Q "%%~k" 0 1 2>nul
	)
)
Del /Q Dir.txt 0 1 2>nul

說明:
首先建立包含檔名及副檔名的參考清單,清單格式為一行一個檔名,並且將參考清單檔檔名變更為 "List.txt" ,且放在與這個批次檔相同路徑下.
如要修改參考清單檔名及備份路徑可修改

Set Folder=D:\Temp&Rem 設定備份路徑,結尾不加 "\"
Set List=List.txt

執行過程:
當開始執行時會先清查所有的邏輯磁區並建立比對檔,比對後即開始執行COPY到指定目錄中,在COPY到的過程中會將磁碟代號變更為資料夾名稱,也就是假設指定目錄為 "D:\TEMP" COPY 的過程會變更為 "D:\TEMP\X\路徑",且刪除來源檔(建議先備份後測試,避免不測),COPY完成後會刪除暫存檔.

補充說明:
若不是在區網中的其它位置執行這個批次檔應該在XCOPY之前加 IF 判斷,以避免備份資料夾的檔案越跑越深

zp145 iT邦新手 5 級 ‧ 2017-07-09 22:56:44 檢舉

謝謝蟹老闆,我再來學習你提供的Script,來精進我的batch。
我寫了4支bat來做這件事。你一支就搞定了~真厲害!!

0
牛哥
iT邦好手 1 級 ‧ 2017-07-05 09:18:55

你要不要用指令robocopy試試...
指令內建功能還滿強大的!

牛哥 iT邦好手 1 級 ‧ 2017-07-05 09:27:27 檢舉

原來己有邦友推薦了~
小成兄,抱歉!
/images/emoticon/emoticon20.gif

小成 iT邦高手 10 級 ‧ 2017-07-05 10:53:07 檢舉

不會啦XD,有您也推薦,表示ROBOCOPY真的很強大XD

我要發表回答

立即登入回答