วันอาทิตย์ที่ 7 เมษายน พ.ศ. 2556

ปูพื้นฐานแบตช์ไฟล์ 2

เคยเจอกระทู้ของเด็กๆ ถามว่า @echo off เป็นไวรัสหรือเปล่า...เห็นมีอยู่ในแบตช์ไฟล์ทุกตัว...จริงแล้วมันไม่ใช่ไวรัสครับ...แต่มันธรรมเนียมซะแล้วว่า...
@ คือ การซ่อนคอมมาน์ดไลน์...
เช่น echo ทดสอบ ; ผลของมันคือ
C:\Documents and Settings\Administrator>echo ทดสอบ
ทดสอบ
แต่ถ้า @echo ทดสอบ ; ผลของมันคือ
ทดสอบ
ไม่มีบรรทัด C:\Documents and Settings\Administrator>echo ทดสอบ แสดงออกมาภายที่คอนโซล
ส่วน Echo off หรือ ไม่ได้หมายความว่า "ไม่ต้องตอบ" แต่หมายความกลับกันคือ "ไม่ต้องถาม" อ้าว...ทำไมเป็นอย่างนั้น...ไม่ต้องถามในที่นี้คือ ไม่ต้องถามที่ "Command Line" หรืออีกนัยหนึ่งก็คือไม่ต้องแสดงคำสั่งที่ทำงานอยู่ที่คอมมานด์ไลน์นั้นเอง แต่ตัวของคำสั่งเอง...ยังเพี้ยนกว่านี้คือ มันไม่สามารถหยุดการแสดงคำสั่งของมันที่ คอมมานด์ไลน์ได้ทำไมนะหรือมันยัง แสดงบรรทัด C:\Documents and Settings\Administrator>echo off ในคำสั่งแรกสุดเพราะตัวมันเอง "หยุดตัวมันเองไม่ได้" จึงต้องใส่เครื่องหมาย @ เพื่อหยุดการแสดงคำสั่งที่คอมมานด์ไลน์ของคำสั่ง Echo off อีกที สรุป คำสั่ง @ คือ คำสั่งหยุดการแสดงผลของคอมมานด์ไลน์ แต่ต้องนำหน้าอยู่ทุกๆ คำสั่ง แต่ Echo off จะแทนคำสั่ง @ นำหน้าทุกคำสั่ง "ยกเว้นตัวมัน" ทีนี้พอเข้าใจหรือยัง รู้สึกยังมี งูสองตัวในหัว...เฮ้อ
ทีนี้มาทำความกระจ้างคำสั่ง echo แบบหมดเปลือกกันซะ... พิมพ์ echo /? เพื่อขอความช่วยเหลือ...ผลคือ

C:\Documents and Settings\Administrator>echo /?
Displays messages, or turns command-echoing on or off.

  ECHO [ON | OFF] ; เปิดปิดคอมมานด์ไลน์
  ECHO [message] ; แสดงข้อความ

Type ECHO without parameters to display the current echo setting.
; ถ้าไม่มีพารามิเตอร์...มันจะยังรอการพิมพ์ On/Off อยู่

ตัวอย่างคำสั่งที่น่าสนใจสำหรับ Echo "แอคโค่ วววววว"

echo Test ; echo{วรรค}Test ผลของมันคือ
Test{บรรทัดใหม่} ; Test{อักขระ LineFeed(ขึ้นบรรทัดใหม่)}{อักขระ Charactor Return(ย้อนกลับไปตัวแรกเหมือนพิมพ์ดีด)} ไม่ต้องสงสัยเลยว่า...ทุกๆ บรรทัดของ echo จะมี 2 Byte เพิ่มเข้ามาเพราะมันเป็น มาตราฐานของ DOS คือมันยังอนุรักษ์การทำงานของอักขระควบคุมโบราณ 2 ตัวนี้...ที่เคยทำงานในรหัส EBCDIC หรือเครื่องที่มีแต่คอนโซลเท่านั้น จึงทำให้ 32 ตัวแรกของรหัส ASCII นั้น...เป็นอักขระควบคุม ซึ่งจะทำให้คำสั่ง echo แสดงผลอักษรเหล่านี้ผิดเพี้ยนไปจากความใจของนักเขียนโปรแกรม

echo{วรรค}{Alt+007} ; แอคโค่ ตามด้วยรหัสควบคุมหมายเลข7 คือ "Beep" หรือการเตือน Error ซึ่งเป็นหนึ่งในรหัสควบคุม 32 ตัวแรกส่งผลให้ DOS เองมีการเตือน "บี๊บ" เหมือน BIOS แต่ถ้าบนวินโดวส์ "เสียง Error" จะดังขึ้น

echo REGEDIT 4>Test.REG ; ส่งข้อความ REGEDIT 4 ไปที่แฟ้ม Test.REG (ในบรรทัดแรก)
echo [HKEY_CURRENT_USER\Control Panel\Desktop]>>Test.REG ;ส่งข้อความ [HKEY_CURRENT_USER\Control Panel\Desktop] ต่อท้ายแฟ้ม Test.REG (ในบรรทัดถัดไป)
***ซึ่งการใช้งาน Pipe (>, >> ,|) จะกล่าวถึงในคราวหลังๆ

echo 00:00:00|time ; คือส่งข้อความเวลา 00:00:00 เชื่อมต่อคำสั่ง Time มีผลทำให้เวลาของเครื่องใน BIOS เองเป็นตามตัวอย่าง
The current time is: 22:19:00.59 ; เวลาเก่า
Enter the new time: 00:00:00 ; เวลาใหม่
วิธีนี้จะประหยัดเวลาในการเซ็ตระบบอย่างมากหากประยุกค์ใช้ในวงแลนเพื่อให้เวลาในร้าน Internet เองหรือสำนักงาน...เป็นเวลาเดียวกัน

echo 01/01/2000|date ; คือส่งข้อความวันที่ 01/01/2000 เชื่อมต่อคำสั่ง Date มีผลทำให้วันที่ของเครื่องใน BIOS เองเป็นไปตามตัวอย่าง
The current date is: Tue 01/08/2013 ; วันเก่า
Enter the new date: (mm-dd-yy) 01/01/2000 ; วันใหม่

echo CatEye|label ; คือส่งชื่อไดร์ฟข้อมูล เชื่อมต่อคำสั่ง Label มีผลทำให้เปลี่ยนชื่อไดร์ฟที่ทำงานอยู่เป็นข้อความที่ต้องการ (ห้ามเกิน 13 Byte)
Volume in drive C: is CatEye ; ชื่อใหม่
Volume Serial Number is xxxx-xxxx ; รหัส Serial Number
Volume label (ENTER for none)? ; ไม่มีปัญหา...ฉลุย..

echo ^<HTML^>>Test.HTM ; คือส่งข้อความว่า <HTML> ไปที่แฟ้ม Test.HTM
คำสั่ง ^ เองพึงมีใช้งานบน CMD.EXE ในสมัย COMMAND.COM ไม่สามารถใช้งานคำสั่งนี้ได้ วิธีนี้สามารถทำให้แบตช์ไฟล์สามารถสร้างเวป...ออกมาได้ด้วย หรือกล่าวคือมันสามารถแสดงอักขระต้องห้ามทั้งหมดผ่าน คำสั่งนี้...

echo. ; echo{จุด} หมายถึงขึ้นบรรทัดใหม่
echo . ; echo{วรรค}{จุด} หมายถึงแสดง "." และขึ้นบรรทัดใหม่
echo ; echo(ลืมจุด) หมายถึง Error ครับ...มันจะแสดงข้อความว่า ECHO is on.

echo Msg1 & echo Msg2 ; คือ แสดงข้อความ Msg1 ขึ้นบรรทัดใหม่ แสดงข้อความ Msg2 ขึ้นบรรทัดใหม่

และแล้ว...ก็หมดเทคนิคคำสั่ง echo ซะที ซึ่งจริงๆ แล้วมันสามารถทำได้มากนี้...แต่ขอยกตัวอย่างเพียงเท่านี้...บางคน...เอาไปประยุกต์ซะน่ากลัว...เช่น Format และตอบ Yes อัตโนมัติ...ซึ่งมันก็ทำได้แต่ถ้ายกตัวอย่างมีหวังมือใหม่...ทำระบบเจ๊งกันพอดี แบตช์ไฟล์เอง...เป็นสิ่งที่เป็นมรดกตกทอดมาจาก DOS สมบัติชิ้นสุดท้ายจาก "เจ้าคุณปู่" ยังไงลองหัดพิมพ์หัดเล่นดู...เพราะการเขียนแบตช์ไฟล์นั้น...ไม่มีใครเป็นตั้งแต่เกิด...ผมถูก COMMAND.COM ด่าว่า Bad Command or filename... อยู่บ่อย...จนตีความหมายของเจ้าคุณปู่ว่า "คำสั่งหรือไฟล์ชั้นเลว..." เจ้าคุณปู่ด่าทุกวัน...แต่ยุคปัจจุบัน...เจ้าคุณปู่...สุภาพมาก ถ้าบอกรักเจ้าคุณปู่...เจ้าคุณปู่มักจะด่าว่า...
'LoveYou' is not recognized as an internal or external command,
operable program or batch file.
อืม...ใครเข้าใจ...ช่วยบอกที...


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

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