การทำ Backup File server แบบง่ายๆ โดยใช้ Batch File
เริ่มต้นที่ปัญหา บริษัทผมมี เครื่อง File server ตัวนึง เอาไว้เป็น Drive กลางให้ฝ่ายต่างๆ ในบริษัท
จำเป็นต้องทำการ Backup Drive ที่แชร์ให้ฝ่ายต่างๆในบริษัทใช้ โดยที่จะต้อง ทำการ Backup ทุกวัน และบริษัทไม่ค่อยให้งบประมาณเท่าไหร่ในเรื่องนี้ ก็เลยต้องทำแบบ เบสิกสุดๆ โดยการ ใช้ backup window เนี่ยแหละทำ
‘ =================================
การทำงานของระบบ Backup ของผมนี้ คือ 1 ที่เครื่อง file server ให้ทำการ ตั้ง schedule Backup ของ window ในแต่ละ folder ออกมาเป็น ไฟล์ .bkf เช่น
ใน Drive D ของเครื่อง File server มี folder ต่างๆดังนี้
E:\-Account
- Marketing
- HR
- Sale
- IT
วิธีการของผมก็คือจะสร้าง Folder อีกตัวนึง ชื่อ DailyBackup ขึ้นมา ใน DailyBackup นี้ก็จะมี Folder ตามฝ่ายต่างๆ เพื่อที่ ผมจะให้ backup window นั้นสร้างไฟล์ bkf ไว้ใน folder เหล่านั้นนะครับ
E:\DailyBackup
|- Account
|-account.bkf
|- Marketing
|-Marketing.bkf
|- HR
|-HR.bkf
|- Sale
|-Sale.bkf
|- IT
|-IT.bkf
หมายเหตุ ไฟล์ *.bkf จะเป็นไฟล์ใหม่ในแต่ละวัน ส่วนวิธีการ backup หาอ่านได้ที่นี่ http://www.justusers.net/articles/ossystem/xpbackup/backup.htm
‘ =================================
เมื่อตั้งข้อมูลเบื้องต้นเสร็จเรียบร้อยแล้วทีนี้ก็เป็น กระบวนการ จับ zip ไฟล์ *.bkf เพื่อบีบอัดข้อมูล ได้มากมายครับ
ผมจึงได้ทำการเขียน batch file ขึ้นมาตัวนึง โคดดังนี้ครับ
‘ ========= ScriptDaily.bat =========
@echo off
for /f “tokens=1-4 delims=/ ” %%i in (”%date%”) do (
set dow=%%i
set month=%%j
set day=%%k
set year=%%l
)
SET d=%year%%month%%day%
SET Source=E:\
SET Des=E:\DailyBackup\
REM ใส่ Log ซะหน่อยครับ เพื่อดูผลของการกระทำ สร้าง folder !LogBackup ขึ้นมา เพื่อเก็บไฟล์ Log
SET LOGPATH=E:\!LogBackup
echo Start Schedule Command Rar File backup as of %d% > %LOGPATH%\B_%d%.txt
echo ======================================================== >> %LOGPATH%\B_%d%.txt
for %%i in (Account Marketing HR Sale IT) DO (
call commandRar.bat %Source%\%%i\%%i.bkf %Des%\%%i\%d%.rar
)
echo ===================================================>> %LOGPATH%\B_%d%.txt
echo ScriptDaily Backup Success!! at %date% %time% >> %LOGPATH%\B_%d%.txt
exit
‘ ======== จบ ScriptDaily.bat ============
จากโคดจะเห็นว่า มีการ วน loop ตาม folder ต่างๆ ที่กำหนดไว้ใน for
และ มีการเรียกใช้ batch อีกตัวเพื่อทำการ zip ในที่นี้ผมใช้ winrar เนื่องจาก สามารถ zip ได้ในขนาดใหญ่ๆได้ และบีบอัดได้ดีกว่า
‘ ======== commandRar.bat =============
@echo off
REM WinRAR - - <@listfiles…>
REM set path WinRar ใน environment ของ window ก่อน
set path=”C:\Program Files\WinRAR\”;%path%
WinRAR a -r %2 %1
echo commandRar %1
echo in to
echo %2 Success!!
echo ========================================================
REM when zip backup file finish. and then delete original file backup
del %1
‘ ======== จบ commandRar.bat =============
เสร็จสิ้นเรียบร้อยแล้ว
หมายเหตุสำหรับคนไม่ชำนาญ
- การเขียน Log File ใน batch file ทำได้ง่ายโดยการ ใช้คำสั่ง echo ข้อมูลออกมาแล้ว จะเอาไปเก็บในไฟล์ไหน ก็เพียงแค่ใช้เครื่องหมาย > ชื่อไฟล์ ดังเช่น
echo Test Create Logfile > C:\testLog.txtก็จะเป็นการสร้าง text file ชื่อ testLog.txt ในไดร์ C ครับ ซึ่งมีข้อความว่า Test Create Logfile
หากต้องการ สร้าง ข้อความต่อ ก็เพียงแค่ ใส่เครื่อง > เป็น 2 ตัวนะครับเช่น
echo Test Create Logfile Line2 >> C:\testLog.txtหลังจากบรรทัดนี้ ไฟล์ testLog.txt จะมี 2 บรรทัด บรรทัดที่ 2 จะชื่อ Test Create Logfile Line2
- การเรียกใช้งาน BatchFile อีกตัว ทำการเรียกได้โดยใช้คำสั่ง Call ที่อยู่ batchfile
เช่น call commandRar.bat
- การ ส่ง parameter ให้ BatchFile อีกตัวนึง ทำได้โดย การใส่ข้อมูลตามหลัง BatchFile โดยการเว้นวรรค 1 ครั้ง และ ใส่ parameter ตัวที่ 2 ต่อไปได้โดยใช้ เว้นวรรค เป็นตัวคั่นระหว่าง parameter ครับ
call commandRar.bat parameter1 parameter2 parameter3
และในไฟล์ commandRar ที่มีการอ้างถึง เราสามารถ อ้างถึง parameter แต่ละตัวได้โดย ใช้ % ตามด้วย parameter ครับ จาก บรรทัดด้านบนนี้ โคดใน commandRar.bat เราสามารถอ้างถึง parameter ต่างๆได้โดย
echo %1 <— จะได้ค่า parameter1
echo %2 <— จะได้ค่า parameter2
echo %3 <— จะได้ค่า parameter3
ก็เป็นอันจบเบื้องต้นนะครับ
Good post! I plan to move into this stuff after I’m done with school, as most of it is time consuming. It’s a great post to reference back to. My blog needs more time to gain in popularity anyway.
D:\Backup>dir
Volume in drive D is DATA
Volume Serial Number is 28B2-E783
Directory of D:\Backup
09/16/2009 03:38 PM .
09/16/2009 03:38 PM ..
09/16/2009 04:00 PM 360 commandRar.bat
09/16/2009 03:06 PM 8,537,088 FileMakerPro.bkf
09/16/2009 04:00 PM 751 ScriptDaily.bat
3 File(s) 8,538,199 bytes
2 Dir(s) 65,974,362,112 bytes free
D:\Backup>ScriptDaily.bat
1-4 was unexpected at this time.
D:\Backup>
ผมลองเอาไปใช้กับ xp เกิดปัญหาแบบนี้ครับ รบกวนแนะนำหน่อย
ผมไม่เห็นว่า คุณปรับ โคดไปอย่างไรน่ะครับ รบกวน โพส โคด ที่แก้ไขใน ไฟล์ scriptdaily.bat ในส่วน loop ด้วยนะครับ
รบกวนถามนอกเรื่องนิดหนึ่งครับ batch นี่มันวนลูปไงครับ
คืออยากให้มัน วนลูปออกมาที่ output.txt
แบบเรียง
hello 1
hello 2
ไปเรื่อยๆจนถึงที่เรากำหนดไว้อ่ะครับ ช่วยสอนหน่อยครับขอบคุณครับ
เขียน Loop ทำได้หลายวิธี สำหรับในตัวอย่างนี้ เป็นการ Loop โดยที่เรากำหนด จำนวนรอบที่แน่นอน เนื่องจาก ผมต้องการ loop ในโฟรเดอร์ที่กำหนดไว้เท่านั้น จึงใช้คำสั่ง for ตามรูปแบบนี้นะครับ
for ตัวแปร in (ข้อมูล1 ข้อมูล2 ข้อมูล3 …) DO {
คำสั่ง
}
ตัวแปร ที่รับ จะใช้รับข้อมูล จะมีรูปแบบ %%ชื่อตัวแปร
ส่วน ข้อมูล1 ใน () จะเป็น ข้อมูลที่เราจะกำหนด ให้ไปกี่ Loop
ลองดูตัวอย่าง ข้างล่างนะครับ
REM ใช้คำสั่ง echo ใส่ข้อความ แล้ว เครื่อง > เพื่อเขียนไปยัง Log ไฟล์ กำหนด path และชื่อไฟล์ ตามคำสั่งด้านล่าง
REM เราจะใช้ echo ข้อมูล และใช้เครื่องหมาย >> ไปยัง path ไฟล์ เพื่อ ใส่บรรทัดต่อไป
echo Start Write Batch File > C:\output.txt
for %%i in (hello1 hello2 hello3) DO (
echo %%i >> C:\output.txt
)
ถ้ามี จำนวนรอบ ที่เป็นตัวเลข เราสามารถใส่ loop กำหนดจำนวนรอบเองได้ ดังนี้
echo Start Write Batch File > C:\output2.txt
for /l %%i in (1 1 10) do (
echo HELLO%%i >> C:\output2.txt
)
ใน in (1 1 10) ค่า 10 คือรอบ ที่จะให้วน จากตัวอย่างนี้ ใน loop for จะวน ทั้งหมด 10 รอบ
ผลลัพธ์ที่ได้ใน ไฟล์ output2.txt ก็คือ
Start Write Batch File
HELLO1
HELLO2
HELLO3
HELLO4
HELLO5
HELLO6
HELLO7
HELLO8
HELLO9
HELLO10
ในบทความนี้ เป็น เพียง เบื้องต้นสำหรับ ใช้งาน backup เท่านั้นนะครับ ถ้าอยาก เขียน batch ให้ลึกจิงๆ ก็ต้องหาหนังสืออ่าน เพิ่มเติมนะครับผม ขอให้โชคดีครับ
สวัสดีครับ ขอโทษที่มาช้าครับ หุหุ
ผมได้แก้ไขบางส่วนเช่น ลบการวนลูปออกเพราะว่าผมมีแค่ไฟล์เดียว แต่จุดประสงค์ของการทำเป็นแบบเดียวกับเจ้าของกระทู้ครับ
ด้านล่างเป็น code ที่ผมใ้ช้อยู่และใช้ได้จริง สาเหตุที่ต้องเปลี่ยนบางส่วนเพราะว่า code ที่ให้ไว้เมื่อนำไปรัน มันจะ error ในส่วนของ for loop ครับ เลยไปหาวิธีอื่นๆมาใช้ ตอนนี้ใช้ได้ดีแล้วครับ ยังไงขอบคุณเจ้าของกระทู้มากๆครับ เป็นแนวทางให้ได้ศึกษา
แต่ไม่แน่ใจว่าผม สามารถเรียกโปรแกรม backup ของ windows xp ผ่านทาง batch ได้เลยไหม เพราะว่าตอนนี้ผมต้องเซ็ต 2 ที่ละครับ
@For /F “tokens=2,3,4 delims=/ ” %%A in (’Date /t’) do @(
Set Month=%%A
Set Day=%%B
Set Year=%%C
)
SET d=%Year%%Month%%Day%
SET Source=D:\Backup\
SET Des=D:\DailyBackup\
SET Log=D:\DailyBackup\log\
REM ใส่ Log ซะหน่อยครับ เพื่อดูผลของการกระทำ สร้าง folder !LogBackup ขึ้นมา เพื่อเก็บไฟล์ Log
echo Start Schedule Command Rar File backup as of %d% > %Log%\log_%d%.txt
echo ===================================================>> %Log%\log_%d%.txt
set path=”C:\Program Files\WinRAR\”;%path%
WinRAR a -r %Des%FileMakerPro%d%.rar %Source%*.bkf
echo ===================================================>> %Log%\log_%d%.txt
echo ScriptDaily Backup Success!! at %date% %time% with file name FileMakerPro%d%.rar >> %Log%\log_%d%.txt
exit
ขอบคุณมากเลยครับ พอดีมีปัญหาให้ต้องใช้ batch แก้อ่ะครับ กุมขมับมาสองวันแล้ว ขอบคุณทุกท่านครับที่ช่วยชี้แจงครับ
รบกวนอีก นิดครับ ถ้า for loop หรือ while นี่ จำนวนรอบนี่ เรารับค่าจาก key board ได้ไหมครับ
แบบกำหนดตัวแปรอ่ะครับ
ได้แล้วครับ
Your article is nice.Thanks for your sharing,it helps me more.I will look forward to your more wonderfull articles.Have a good time.
Thank you very much. I am wonderring if i can share your article in the bookmarks of society,
Then more friends can talk about this problem.
จะลองทำตามที่คุณแนะนำจ๊ะ
รบกวนช่วยบอกวิธี backup file ด้วยคำสั่ง dos หน่อยคะ แบบมีเงื่อนไขด้วย หากท่านไหนทราบรบกวนแอดเมลล์มาคุยหน่อยนะคะ momo1610naka@hotmail.com ขอบคุณมากคะ