請教各位大大,小弟有寫個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目錄
2.bat執行目錄
3.掃描比對清單
4.磁區代號清單
5.比對到的清單路徑Log
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
看看合不合用
@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 判斷,以避免備份資料夾的檔案越跑越深
你要不要用指令robocopy試試...
指令內建功能還滿強大的!