<<< เพิ่งเขียนโปรแกรม อัพเดตวันเวลาผ่าน LAN สำเร็จ นำมาแจกเผื่อนำไปปรับปรุงอัพเดต
Maha Arai รู้สึกเวียนหัวต้องมานั่งอัพเดพวันที่ทุกวัน เนื่องจากค อมมือสองที่เราไปซื้อมาถูกๆ แบตมันหมด แล้วจะไปเปลี่ยนพวกเคี่ยวคิ ดเกือบ 1,000 หรือ 500 บาทขึ้น อาจเป็นเพราะ notebook บางรุ่นมันแกะยาก แกะไม่ดีพั งชิ้นส่วนแตกหักเพราะเราเคย แกะมาทีหนึ่งแล้ว ก็เลยมาเขียนโปรแกรมอัพเดตง่ายๆ แค่รันโปรแกรมที่เขียนหลังต ่อสายแลนก็จบง่ายๆ
Maha Arai สำหรับตัวโปรแกรมมี 2 ไฟล์เล็กๆ ที่แยกเป็น 2 ไฟล์เพราะฟังก์ชั่นของ VBS มันง่ายกว่าทำใน Batch files ก็จะแยกเป็น 2 ไฟล์ดังนี้
Maha Arai ไฟล์ ชื่อ get_server_time.bat ให้ copy source code ด้านล่างนี้ไปแปะใน notepad แล้ว save เป็นชื่อ get_server_time.bat หรืออะไรก็ได้ที่นามสกุล .bat
net use p: \\LANPATH /persistent:no 1>NUL 2>NUL
del p:\tmp\date.txt
date /T > p:\tmp\date.txt
cscript //nologo getdate.vbs p:\tmp\date.txt
Maha Arai โดย LANPATH ให้เปลี่ยนให้ตรงกับเครื่องที่เราเชื่อมต่อโดยปกติมันจะอยู่ในรูปแบบ
\\ชื่อเครื่องที่เราจะเชื่อมต่อ\พาธ
หรือจะดัดแปลงส่วนนี้เป็น Drive F: ก็ได้
Maha Arai หลักการทำงาน
net use p: \\LANPATH /persistent:no 1>NUL 2>NUL
เป็นคำสั่ง Map drive p:
del p:\tmp\date.txt
เป็นคำสั่งลบไฟล์เก่า ที่อยู่ใน Drive ราก tmp ชื่อไฟล์ date.txt จะตั้งเป็นรากอะไรชื่อไฟล์อะไรก็ได้
date /T > p:\tmp\date.txt
เป็นคำสั่งหลอกๆ เพื่อสร้างไฟล์ date.txt ขึ้นมา เป็นการนำวันที่ในเครื่องไปเขียนไฟล์ใหม่เพื่อนำวันที่ สร้างไฟล์ใหม่มาใช้
cscript //nologo getdate.vbs p:\tmp\date.txt
เป็นการเรียกใช้งานโปรแกรม getdate.vbs ที่เป็น vb script ซึ่งsource code จะอยู่ด้านล่างนี้
Maha Arai copy ข้อความด้านล่างไปแปะใน notepad และตั้งชื่อว่า getdate.vbs จะตั้งเป็นชื่ออื่นก็ได้แต่ต้องไปเปลี่ยนชื่อให้ตรงกับ โปรแกรมที่เรียกมาจากโปรแกร มแรก
Dim objFS, objArgs, strFile, dt , sh
Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
dt = objFS.GetFile(strFile).DateLastModified
Set sh = CreateObject("Wscript.shell")
if (mid(dt,2,1)="/") then
if (mid(dt,3,2)="10") or (mid(dt,3,2)="11") or (mid(dt,3,2)="12") then
sh.run "cmd /K date " & mid(dt,3,2) & "-" & mid(dt,1,1) & "-" & CStr(Clng(mid(dt,6,4))-543) & " & exit"
sh.run "cmd /K time " & mid(CStr(dt),11,8) & " & exit"
else
sh.run "cmd /K date " & mid(dt,3,1) & "-" & mid(dt,1,1) & "-" & CStr(Clng(mid(dt,5,4))-543) & " & exit"
sh.run "cmd /K time " & mid(CStr(dt),10,8) & " & exit"
end if
else
if (mid(dt,4,2)="10") or (mid(dt,4,2)="11") or (mid(dt,4,2)="12") then
sh.run "cmd /K date " & mid(dt,4,2) & "-" & mid(dt,1,2) & "-" & CStr(Clng(mid(dt,7,4))-543) & " & exit"
sh.run "cmd /K time " & mid(CStr(dt),12,8) & " & exit"
else
sh.run "cmd /K date " & mid(dt,4,1) & "-" & mid(dt,1,2) & "-" & CStr(Clng(mid(dt,6,4))-543) & " & exit"
sh.run "cmd /K time " & mid(CStr(dt),11,8) & " & exit"
end if
end if
Maha Arai หลักการทำงานโปรแกรมนี้ก็แบ่งเป็นสองส่วน ส่วนแรก
Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
dt = objFS.GetFile(strFile).DateLastModified
เพื่ออ่านค่าวันที่ที่อัพเดตครั้งสุดท้ายจากไฟล์ที่อยา กดู ซึ่งกรณีนี้ก็คือไฟล์ p:\tmp\date.txt ที่อยู่หลังคำสั่ง cscript //nologo getdate.vbs ในโปรแกรมแรกนั่นเอง
Maha Arai ส่วนที่สองจะเป็นการนำค่าที่อ่านได้มาแปลงให้ถูกต้องตา มรูปแบบวันที่ของเครื่องเป็ นการเรียกใช้การทำงานของ Command line มีดังนี้
Set sh = CreateObject("Wscript.shell")
sh.run "cmd /K time " & mid(CStr(dt),11,8) & " & exit"
นำค่าจากตัวแปร dt ที่รับค่าวันที่อัพเดตครั้งสุดท้ายมาเซ็ตใส่ให้ โปรแกรม time โดยที่ต้องใช้ฟังก์ชั่น Mid ตัดข้อความ ตั้งแต่ตำแหน่งที่ 11 ไป 8 ตัวเพราะค่าวันที่อ่านได้มั นอยู่ในรูปแบบ วันที่ มาก่อนแล้วตามด้วย เวลาซึ่งเริ่มที่ตำแหน่งที่ 11 นับไปอีก 8 ตัวในรูปแบบ hh:mm:ss
Maha Arai ส่วนวันที่ยุ่งเล็กน้อย ต้องแปลงจากค่าที่อ่านได้ คั่นด้วย /และเป็นรูปแบบวันเดือนปี เป็นรูปแบบ เดือนวันปี และคั่นด้วย - แทนคือรูปแบบนี้ mm-dd-yyyy และต้องแปลงเป็นปี ค.ศ. - 543 แปลงตัวหนังสือเป็นตัวเลขลบเส ร็จแปลงกลับเป็นตัวหนังสือ และที่เช็คเงื่อนไข = 10 - 12 ก็เพราะว่าเวลามีเดือนเดียว มันอยู่ในรูป 8 แทนที่จะเป็น 08
if (mid(dt,4,2)="10") or (mid(dt,4,2)="11") or (mid(dt,4,2)="12") then
sh.run "cmd /K date " & mid(dt,4,2) & "-" & mid(dt,1,2) & "-" & CStr(CInt(mid(dt,7,4))-543) & " & exit"
else
sh.run "cmd /K date " & mid(dt,4,1) & "-" & mid(dt,1,2) & "-" & CStr(CInt(mid(dt,6,4))-543) & " & exit"
end if
Maha Arai อันที่จริงใช้คำสั่ง เข้า command line ด้วยคำสั่ง cmd ที่ run แล้วพิมพ์ date หรือ time เพื่อใส่ค่าเองก็ได้แต่ยุ่งยากรวมทั้งแก้วันเวลาที่มัน จะย้อนหลังไปเป็นสิบๆ ปีที่ปฏิทินของ windows ก็ได้ แต่วิธีนี้สะดวกสุดไม่ต้องใ ส่เวลาเองแค่ต่อสายแลนดับคล ิ๊กโปรแกรม change_date.bat ก็จบ ยังสามารถนำวิธีนี้ไปประยุก ต์ทำนั่นนี่ได้อีกด้วย
Maha Arai จากการทดสอบกับมือถือปรากฏว่าไม่เวิร์กเนื่องจากวันที่ ที่สร้างไฟล์เป็นวันที่ของเ ครื่องคอมที่เชื่อมต่อไม่ใช ่วันที่ของมือถือ คล้ายๆ flash drive ทั้งหลายนั่นเอง
Maha Arai แต่ประโยชน์ 2 อย่างเท่าที่เรามองเห็นในการนำไปประยุกต์ใช้อย่างแรกเล ยคือถ้าแบตเสื่อมก็ไม่จำเป็ นต้องไปเปลี่ยน ถ้ามีแลนเหลือสักเครื่องที่ แบตดีก็สามารถใช้วิธีนี้ในก ารอัพเดตวันที่เครื่องที่แบ ตเสื่อมได้ทั้งหมดไม่ว่าจะม ีกี่ร้อยกี่พันเครื่อง
Maha Arai อย่างที่สองอันนี้มีประโยชน์มากในวงการ database นั่นคือเวลาเราอัพเดตข้อมูล ในโปรแกรมดาต้าเบสเช่น MS Access วันที่อัพเดตจากค่า now() ในเครื่องก็มักเป็นวันที่จา กเครื่องที่ส่งไป ไม่ใช่วันที่เครื่อง Server ดังนั้นเวลาอาจเพี้ยนจากที่ แต่ละเครื่องอาจตั้งเวลาไม่ ตรงกัน สามารถใช้หลักการนี้อัพเดตเ รคคอร์ดด้วยเวลาจาก Server ตัวเดียวกันได้ และเป็นเทคนิคที่กินทรัพยาก รน้อยกว่าเทคนิคที่ต้องรันโ ปรแกรมหลอกๆ ไว้ที่ Server เพื่อจะอัพเดตเวลาให้เครื่อ งลูกที่ร้องขอเวลาไป แบบนี้เวลาใกล้เคียงกับเครื ่อง Server มากแตกต่างไม่เกินวินาที สามารถนำลอจิคนี้ไปใช้ได้ ถ้าง่ายหน่อยก็แค่เอาโปรแกร มนี้ไปแล้วบังคับให้ทุกเครื ่องเวลาเข้าโปรแกรมก็มาอัพเ ดตเวลาวันที่ให้ตรงกับ Server ทุกเครื่องก็ไม่ต้องดัดแปลง อะไรมากแค่มาเรียกใช้โปรแกร มนี้ก็จบ
Maha Arai เมื่อกี้ไปลองติดตั้งในเครื่องลูกข่ายในที่ทำงาน พบว่าถ้าเป็น Windows XP ไม่มีปัญหา แต่ Windows 2000 มีปัญหาฟังก์ชั่น CInt ไม่ทำงานอาจต้องเปลี่ยนเป็น ฟังก์ชั่นแปลงเป็นตัวเลขอย่ างอื่นแทน สรุปมันคือ โปรแกรม Get Server Time ดึงเวลาจากเครื่ ่องแม่มาอัพเดตจะได้เวลาเหม ือนๆ กัน
http://www.facebook.com/maha.arai
--------------------------------------------------
FfF