วันพุธที่ 19 มิถุนายน พ.ศ. 2556

ปูพื้นฐาน(ขั้นเทพ) Batch File ตอน 1

การเขียนแบตช์ไฟล์เพื่อให้ได้โปรแกรมตามเป้าหมาย...บางครั้งผู้ที่เขียนติดนู่นติดนี่...ก็ล่มเิลิกเสียแล้วเพราะโปรแกรมด้านนี้...ต้องอาศัยผู้ที่มีความเพียร...และ "บ้าพลัง" อย่างมาก...ต้องการเอาชนะอุปสรรคและขีดจำกัดของภาษา ซึ่งผู้เขียนเรียนรู้ในตอนแรก...แทบจะไม่ได้อะไรจากมันมาก...แต่พอคิดจะเอามันมาเขียนเกมส์ "คำตอบเสียงดังในหัวคือ บ้าไปแ้ล้ว" แต่มันก็จริง "บ้าไปแล้ว" เอา Batch File มาเขียนเกมส์ แต่ขีดจำกัดและอุปสรรคนั้น...เป็นแรงผลักดันสำหรับพวก "บ้าพลัง" ฉนั้น...ต้องข้ามฝ่าไปให้ได้
วันนี้เรามาเรียนแบบก้าวกระโดดอีกแหละ...กับขีดจำกัดใหม่ๆ ของ CMD.EXE ซึ่งแตกต่างจากการเขียนโปรแกรมในยุคก่อนๆ มาก...

ไม่จำเป็นอีกแล้ว...ต้องต่อ Pipe ทุกบรรทัดเพื่อยิงคำสั่งไปยังแฟ้มที่ต้องการ?
เมื่่อก่อนคุณเองต้องการสร้างแฟ้ม ReadMe.TXT เพื่อจะบอกคุณสมบัติโปรแกรมแต่บางครั้งต้องส่งคำสั่ง > และ >> เพื่อยิ่งคำสั่ง Echo ไปยังเป้าหมาย...แต่ใน CMD.EXE นั้นไม่ต้องทำอย่างนั้นอีกแล้ว...ให้คุณระบุ ( "วงเล็บเปิด" และ "ชุดคำสั่งกี่บรรทัดก็ว่ามา" และ ) "วงเล็บปิด" ตามด้วย Pipe ที่ยิง ดังนี้
@echo off
rem คำสั่ง DOS Batch File ยุคก่อน
echo นี้คิือข้อความทดสอบบรรทัดที่ 1>ReadMe.TXT
echo นี้คิือข้อความทดสอบบรรทัดที่ 2>>ReadMe.TXT
echo นี้คิือข้อความทดสอบบรรทัดที่ 3>>ReadMe.TXT
echo นี้คิือข้อความทดสอบบรรทัดที่ 4>>ReadMe.TXT
echo นี้คิือข้อความทดสอบบรรทัดที่ 5>>ReadMe.TXT
echo นี้คิือข้อความทดสอบบรรทัดที่ 6>>ReadMe.TXT
start ReadMe.TXT

ในปัจจุบันเป็นแบบนี้...

@echo off
rem คำสั่ง Batch File ยุคใหม่
( echo นี้คิือข้อความทดสอบบรรทัดที่ 1
  echo นี้คิือข้อความทดสอบบรรทัดที่ 2
  echo นี้คิือข้อความทดสอบบรรทัดที่ 3
  echo นี้คิือข้อความทดสอบบรรทัดที่ 4
  echo นี้คิือข้อความทดสอบบรรทัดที่ 5
  echo นี้คิือข้อความทดสอบบรรทัดที่ 6
)>ReadMe.TXT
start ReadMe.TXT

ไม่จำเป็นอีกแล้ว...ที่ต้องระบุตำแหน่งสิ้นสุด Batch File?
เมื่อก่อน ถ้าคุณต้องเขียนแบตช์ไฟล์และมีการ Goto :END เพื่อบอกให้รู้ว่า...นี้น่ะนะ...สิ้นสุดคำสั่งทั่งมวลแล้ว...ไม่ต้องร่ายบรรทัดคอมมานด์มาอีก... ถ้าเป็นเมื่อก่อนต้องระบุ :END หรือ :EndOfFile เพิ่อบอกให้ Batch File รู้ว่า ในตอนท้ายสุดของคำสั่งว่า...มันหมดแล้วนะคำสั่งทั้งหมด...ของโปรแกรมเช่น
@Echo
:Main
dir
type
goto :End

goto :Main
.
.
:End

เจ้า :End จะเป็นส่วนที่บอกว่า...สิ้นสุดแล้วนะโปรแกรมแต่ต่อไปนี้...ไม่ต้องอีกแ้ล้ว...แค่คุณใส่้คำสั่งนี้
:EOF หรือ End Of File แค่นี้...Batch File จะเข้าใจทันทีว่าไปที่ท้ายสุดของโปรแกรมดังนี้
@echo
echo Type 1-3 goto Label
if not "%1"== "" goto :%1
goto :EOF

:1
echo %1
goto :EOF

:2
echo %1
goto :EOF

:3
echo %1
goto :EOF

โปรแกรมนี้...จะทำการบอกตำแหน่งที่มันกระโดดไป...โดยไม่เห็นต้องระบุตำแหน่ง :EOF เลยแม้แต่น้อย

ไม่จำเป็นอีกแล้ว...ที่ต้องยิงคำสั่งหรือผลการทำงานไปยังแฟ้มอื่น...ให้รกเครื่อง?
อย่างที่เคยบอกไปแล้วตั้งแต่ตอนแรกๆ คือ ใครเข้าใจคำสั่ง For /f ได้ท่่องแท้...เหมือนรู้ซึ่งถึงคัมภรี์ "มังกร 18 ท่า" ของมังกรหยก เพราะมันถือเป็นไม้ตายของ CMD บนวินโดวส์อย่างแท้จริงเพราะมันสามารถทำงานที่ซับซ้อนให้จบภายใน Batch File ตัวเดียว...โดยไม่ต้องโยนคำสั่งไปยังแฟ้มอื่นๆ อีกต่อไป

for /f "tokens=*" %%l in ('DIR *.*') do echo %%l
หมายถึง ให้นำคำสั่ง DIR *.* มาเก็บยังตัวแปร %%l ทีีละบรรทัด โดย Tokens คือ * หมายถึง โดยไม่สนใจว่้ามีกี่คอลัมภ์ ให้นำมาหมดสมมุติผลที่ได้ดังนี้
Volume in drive C is New Volume
Volume Serial Number is D04A-1158
Directory of C:\DOCUME~1\SM
06/19/2013  03:03 PM    <DIR>          .
06/19/2013  03:03 PM    <DIR>          ..
06/19/2013  03:03 PM                61 1.bat
06/18/2013  09:32 AM    <DIR>          Desktop
06/18/2012  12:46 AM    <DIR>          Favorites
06/18/2012  12:40 AM    <DIR>          handyCafe
09/29/2012  12:46 AM    <DIR>          My Documents
07/01/2012  03:42 PM    <DIR>          Start Menu
06/20/2012  08:44 PM    <DIR>          Tracing
1 File(s)             61 bytes
8 Dir(s)  18,231,889,920 bytes free

for /f "token=1" %%l in ('DIR *.*') do echo %%l
หมายถึง เก็บบรรทัด DIR มาใน %%l โดยนำมาเฉพาะ คอลัมภ์ที่ 1
ผลที่ไำด้จะเป็นเช่นนี้
Volume
Volume
Directory
06/19/2013
06/19/2013
06/19/2013
06/18/2013
06/18/2012
06/18/2012
09/29/2012
07/01/2012
06/20/2012
1
8

for /f "token=1-3" %%l in ('DIR *.*') do echo %%l %%m %%n
หมายถึง ให้เก็บบรรทัด DIR *.* ใน %%l  %%m %%n (เพราะ 1 คือ %%l และ 2-3 จะเป็น %%m-%%n โดยอัตโนมัติ) โดยนำมาเฉพาะ คอลัมภ์ที่ 1-3
Volume in drive
Volume Serial Number
Directory of C:\DOCUME~1\SM
06/19/2013 03:07 PM
06/19/2013 03:07 PM
06/19/2013 03:07 PM
06/18/2013 09:32 AM
06/18/2012 12:46 AM
06/18/2012 12:40 AM
09/29/2012 12:46 AM
07/01/2012 03:42 PM
06/20/2012 08:44 PM
1 File(s) 71
8 Dir(s) 18,233,896,960

ตอนหน้าจะมาต่อ For /F ต่อกัน

ไม่มีความคิดเห็น:

แสดงความคิดเห็น