Batch file กับการวน Loop


เนื่องจากมีโอกาสที่ต้องตรวจสอบไฟล์ต่าง ๆ ใน System32 ว่ามีอยู่หรือเปล่า ครั้นจะให้ User ตรวจสอบให้ทีละไฟล์ก็ดูจะยุ่งยากไปหน่อย ก็เลยได้เขียน Batch file ในการตรวจสอบ จากนั้นจึงเขียนอีกไฟล์เพื่อทำการ register ไฟล์เหล่านั้น

บทความนี้ก็จะแสดงวิธีการวน Loop ใน batch file กันนะ โดยจะมีรายละเอียดอื่นที่จำเป็นเพิ่มขึ้นมาคือ การใช้ Array ใน batch

คำสั่งที่จะใช้ในการตรวจสอบไฟล์ที่จะใช้คือ exist ร่วมกับ if โดยมีรูปแบบดังนี้
if exist C:\Windows\System32\File1.OCX echo OK - File1.OCX

และเนื่องจาก batch file ไม่มีคำสั่ง else ดังนั้นจึงต้องเขียน if อีกอันเพื่อดัก แจ้งเตือนกรณีไม่มีไฟล์อยู่ โดยใช้รูปแบบคำสั่ง
if not exist C:\Windows\System32\File1.OCX echo Not exist - File1.OCX

edit : มีคำสั่ง else นะครับ สามารถแก้ไขเป็นรูปแบบ
if exist C:\Windows\System32\File1.OCX (echo OK - File1.OCX) else (echo Not exist - File1.OCX)
ได้ครับ

ถ้าจะเขียน batch file แบบถึก ๆ ก็สามารถเขียนได้โดยการเอา Code ข้างต้นมาเขียนต่อกัน แล้วเปลี่ยนชื่อไฟล์ไปเรื่อย ๆ จนครบทุกไฟล์
ถ้ามี 15 ไฟล์ที่ต้องตรวจสอบ ก็เขียนไปประมาณ 30 บรรทัด แบบนี้

if exist C:\Windows\System32\File1.OCX echo OK - File1.OCX
if not exist C:\Windows\System32\File1.OCX echo Not exist - File1.OCX
if exist C:\Windows\System32\File2.OCX echo OK - File2.OCX
if not exist C:\Windows\System32\File2.OCX echo Not exist - File2.OCX
if exist C:\Windows\System32\File3.OCX echo OK - File3.OCX
if not exist C:\Windows\System32\File3.OCX echo Not exist - File3.OCX
if exist C:\Windows\System32\File4.OCX echo OK - File4.OCX
if not exist C:\Windows\System32\File4.OCX echo Not exist - File4.OCX
... และต่อไปเรื่อย ๆ

แบบนี้มันก็ทำได้นะ แต่มันจะมีปัญหาเวลาเราต้องการนำมาใช้ซ้ำ เราต้องมาแก้ทุกบรรทัด ซึ่งมันเยอะ และทำให้พิดพลาดได้ง่าย
อีกปัญหาคือ หากพิมพ์ path ผิด เราต้องมานั่งแก้ใหม่หมดเลย

จึงใช้วิธีการสร้างตัวแปรแบบ Array ขึ้นมาเพื่อเก็บชื่อไฟล์ที่ใช้ตรวจสอบ
จากนั้นจึงค่อยใช้วิธีการวน Loop ในการตรวจสอบ

เมื่อทำแบบนี้ก็จะสามารถ reuse code นี้ได้ง่ายมากขึ้น

การสร้างตัวแปร Array ก็จะทำได้โดย
set chkFileName[0]=ชื่อไฟล์1
set chkFileName[1]=ชื่อไฟล์2
set chkFileName[2]=ชื่อไฟล์3
... ต่อไปจนครบทุกไฟล์

การอ้างอิงไปยังตัวแปร Array ที่เราสร้างขึ้น
!chkFileName[index]!
โดย index คือตัวชี้ไปยังสมาชิกใน Array

ในส่วนของการวน Loop ก็จะได้
for /l %%n in (0,1,18) do (
if exist C:\Windows\System32\!chkFileName[%%n]! echo OK - !chkFileName[%%n]!
if not exist C:\Windows\System32\!chkFileName[%%n]! echo Not exist - !chkFileName[%%n]!
)


มาดู code เต็ม ๆ กัน
@echo off
setlocal enabledelayedexpansion

CHOICE /M "Press Y for Window32bit and N for Windows64bit"
if "%ERRORLEVEL%" EQU "1" goto Win32Bit
if "%ERRORLEVEL%" EQU "2" goto Win64Bit

:Win32Bit
set refWindow="System32"
goto ResumeCheckFile

:Win64Bit
set refWindow="SysWOW64"
goto ResumeCheckFile

:ResumeCheckFile
::List file that need to check
set chkFileName[0]=msvbvm60.dll
set chkFileName[1]=oleaut32.dll
set chkFileName[2]=olepro32.dll
set chkFileName[3]=asycfilt.dll
set chkFileName[4]=stdole2.tlb
set chkFileName[5]=COMCAT.DLL
set chkFileName[6]=MSSTDFMT.DLL
set chkFileName[7]=MSDBRPTR.DLL
set chkFileName[8]=msjro.dll
set chkFileName[9]=EXCEL.EXE
set chkFileName[10]=MSHFLXGD.OCX
set chkFileName[11]=FM20.DLL
set chkFileName[12]=TABCTL32.OCX
set chkFileName[13]=MSCOMCTL.OCX
set chkFileName[14]=COMDLG32.OCX
set chkFileName[15]=MSCOMCT2.OCX
set chkFileName[16]=VB6STKIT.DLL

echo ## Check vb need reference file ##
echo =========================
for /l %%n in (0,1,16) do (
if exist C:\Windows\!refWindow!\!chkFileName[%%n]! echo OK - !chkFileName[%%n]!
if not exist C:\Windows\!refWindow!\!chkFileName[%%n]! echo Not exist - !chkFileName[%%n]!
)
echo ## Finished check ##
echo =========================
pause

จากนั้นก็ทำการ Save ไว้เป็น Batch file

โดยใน code ตัวอย่างนี้ เพิ่มการเลือกว่าระบบที่กำลังตรวจสอบนี้ เป็น windows 32bit หรือ 64bit เนื่องจากทั้งสองระบบตำแหน่งไฟล์ระบบมันอยู่คนละตำแหน่งกัน

เมื่อทดสอบรัน batch file ก็จะได้ผลลัพธ์ ประมาณนี้



[Note ไว้กันลืม]

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Make BIG checkbox in Excel

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2

Measurement Equipment Management Software (Calibration Plan Software)