ข้ามไปที่เนื้อหาหลัก

Batch File Hybird ตอนที่ 1

ณ บัดนี้..Batch File ได้เข้าสู่ยุคสูงสุดของมันแล้ว ตั้งแต่วินโดวส์ 7 เป็นต้นมา...เพราะคาดว่าในอนาคต วินโดวส์ 10 เอง จะโละ มันออก เพราะญาติห่างๆ ของมันแฟ้ม .COM หรือ Command File ได้หายไปจากวินโดวส์ตั้งแต่ Windows 10 โปรแกรมหรือ คำสั่ง Assembly แบบ 16 Bit สูญพันธ์แบบถาวร ผมหาข้อมูลและทางลัด ต่างๆ เพื่อเรียกโปรแกรมแบบ 16 บิต ให้ทำงานบน 64 Bit นั้น ไม่ว่าจะด้วยคำสั่ง Start ที่มีบริการบางตัวอนุญาต คำสั่ง 16 บิต ได้ตาม Help ของมัน แต่ความเป็นจริงแล้ว...มันทำงานไม่ได้เลย หรือแม้แต่การสร้างโปรแกรม .COM ด้วย DEBUG.EXE ซึ่งเป็น Assembler เล็กที่ติดมากับวินโดวส์ ก็ทำไม่ได้เพราะมันทั้งหมด สูญหายไปจากระบบตั้งแต่วินโดวส์ 8 เป็นต้นมา อืม...คาดว่าหน่วยความจำแบบ Convention Memory นั้นตัวระบบปฏิบัติการก็น่าจะโละทิ้งและยกเลิกไปตั้งแต่วินโดวส์ 8 แล้ว ทำให้โปรแกรมที่ทำงานในรูปแบบ MS-DOS ใดๆ ก็ตาม...ไม่สามารถทำงานได้บนวินโดวส์อีกต่อไป แล้วทำไม Batch File เองยังคงอยู่ อาจจะเป็นเพราะรูปแบบเดิมๆ ที่ผู้ใช้งานมักจะเรียกใช้คำสั่งสคริปโบราณตัวนี้ติดมือ มากว่า30 ปี ขึ้นไป...มันเขียนง่าย มันทำงานง่ายๆ จึงต้องสรุปประมาณนี้ว่าโปรแกรมที่จะทำงานบน DOS ถ้าชื่อซ้ำกันมันจะทำงานเรียงกันดังนี้

1. EXE หรือ Execute Program
2. BAT หรือ Batch File
3. DOS Macro หรือ DOSKey
แฟ้ม COM ที่เคยอยู่อันดับแรก มันได้หายไปแล้ว

มาเข้าเรื่อง Batch Hybrid ...
โปรแกรมแบบผสมผสานคำสั่งคืออะไร...มันคือ Batch File ที่สามารถทำงานบน CMD หรือ วินโดวส์ก็ได้...โดยตัวของมันเองสามารถเรียกใช้ภาษาคอมพิวเตอร์ได้มากกว่า 1 ภาษา ... อึย...มันทำได้อย่างไร... จริงๆ มันทำได้มานานแล้ว...เพียงแต่ไม่เป็นที่นิยมเพราะรูปแบบ Hybrid แบบโบราณ (ยุคก่อน) ต้องสร้างแฟ้มคำสั่งขึ้นมาอีก ไฟล์ หรือ อีกโปรแกรมแล้วค่อยเรียกใช้งาน...แต่ ณ บัดนี้...ไม่ต้องแล้ว... Batch File เองสามารถเรียกตัวมันเองหรือ %0 (การเรียกพารามิเตอร์ชื่อแฟ้มคำสั่ง) มาทำงานบนตัวแปรภาษาของภาษาอื่นๆ ได้เลย แต่ต้องรู้กฎของภาษานั้นๆ หรือ รูปแบบคำสั่งพิเศษ เพื่อให้คำสั่งภายใน Batch File ไม่ไปกระทบต่อสคริปคำสั่งอื่นๆ ผู้เขียนขอยกตัวอย่างภาษาที่มีอยู่ในระบบปฏิบัติการวินโดวส์เท่านั้น...ส่วนภาษาอื่น เช่น Pert, Ruby, หรือ Python เองต้องศึกษาเอาเพิ่มเติมแต่ขอเสริมเรื่อง กฏที่แหกกฎและความน่ากลัวของภาษา Batch File ก่อนคือ

ถ้าผู้อ่านนึกสนุก อยากลองเปลี่ยนนามสกุล .EXE เป็น .BAT เพื่อเรียกมันทำงานบน CMD นั้นทำได้หรือไม่
คำตอบคือ ทำได้...และมันก็ทำงานเช่นเดียวกันบโปรแกรม .EXE ทั่วๆ ไปเสียด้วย นั้นแหละ...เป็นเหตุผลว่า...ถ้าเจอแฟ้ม .BAT, .CMD อย่านึกว่าเป็นเพียงสคริปที่เขียนขึ้นจาก NotePad อย่างเดียว เพราะมันสามารถ ใช้นามสกุล .EXE เปลี่ยนเป็น .BAT หรือ .CMD ก็ได้ เพียงระบบปฏิบัติการจะแยกแยะ Signalture ว่ามันเป็น MZ หรือเปล่า ถ้าเป็น MZ นั่น หมายถึงเป็นโปรแกรม .EXE โดยที่ไม่ติด Error ใดๆ

แล้วอย่างนี้โปรแกรม Batch ของบางคน...ที่อยู่ใน GitHub และ Source Code ทำไมถึงอ่านไม่ออกหรือ เป็น .EXE กันแน่
คำตอบ คือ โปรแกรม Batch File เป็นโปรแกรมที่ทำงานด้วยรหัส ASCII ฉนั้น มันจะไม่สนใจ Unicode อื่นๆ ที่เป็นรูปแบบต่างบน GUI และส่วนใหญ่โปรแกรมของนักพัฒนาเมืองนอกมักจะมีลูกเล่นที่สำคัญคือ การลบคำสั่ง LineFeed หรือ Charactor LineFeed ใน ASCII เป็นรหัสตัวที่ 13 (เป็นคืย์เดียวกับแป้น Enter) ออกไปจากตัว Batch File ด้วยโปรแกรมพิเศษ เช่น Notepad++ หรือเขียนขึ้นมาต่างหาก เพื่อให้ Batch File เป็นคำสั่งยาวๆ บรรทัดเดียวไล่ไปจนจบ (เปิดด้วย Notepad ธรรมดา นรกเข้าแน่...เพราะคำสั่งยาวเป็นห่างว่าว อ่านไม่ออกแก้ก็ไม่ได้) และที่แสบไปกว่านั้นคือ Signalture Hex(FF) Hex(F4) หรือ ASCII 255 254 นำหน้า Batch File เมื่อไหร่่เป็นอันว่า NotePad++ ก็อ่านไม่ออกเป็นภาษาจีนที่อ่านไม่ออก...แต่ข้อเสียของมันคือ มันถือเป็นคำสั่ง Batch File ด้วย ดังนั้นมันจะมีบรรทัด Error จึงต้องเขียนคำสั่ง @cls ตามที่หลังเพื่อล้างหน้าจอ...จากนั้นทุกๆ ก็เป็นคำสั่ง Batch File ที่ทำงานได้ตามปกติ
หมายเหตุ...ถ้าใครสร้าง 255 และ 254 ไม่เป็น ดาวน์โหลดโปรแกรมผมไปดีกว่า...ถอดรหัสแล้วเข้ารหัสได้โดยไม่มีปัญหา

มาดูตัวอย่างการใช้คำสั่ง Hybrid กัน

1.อันนี้คือ JAVA Script

@if (@X)==(@Y) @end
/****************** Batch Command portion ***********************
@echo off
cls
cscript //E:JScript //nologo %0
pause
goto :eof
****************************************************************/

/*********************** JavaScript portion ********************/
WScript.Echo("This is a message form JavaScript");
WScript.CreateObject("WScript.Shell").Popup("Hello World");

2. อันนี้คือ VBScript
::' ---------- Batch portion -------------------
rem^ &@echo off
rem^ &cls
rem^ &cscript //nologo //e:vbscript %0
rem^ &pause
rem^ &goto :eof

'------------- VBScript portion ----------------
WScript.Echo("This is a message form VBScript")
WScript.CreateObject("WScript.Shell").Popup("Hello World")

3. และอันนี้คือ Power Shell สคริป แห่งอนาคต
<############## Batch portion #########################
@echo off
cls
powershell -noprofile "iex (gc \"%~f0\" | out-string)"
pause
goto :eof
######################################################>

<############# Power Shell portion ###################>
Write-host "This is a message form PowerShell"
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Hello World")

จะเห็นว่า...ทุกภาษา จะเรียกแฟ้ม Batch File ที่ทำงานอยู่มาเรียกตัวมันเองเพื่อคำการคำนวนอีกภาษาได้โดยไม่ต้องสร้างแฟ้มคำสั่งใหม่ ที่สำคัญคือตำแหน่ง Portion ของ

Batch File นั้น...แต่ละภาษาจะไม่เหมือนกัน...ต้องจำให้ดีว่า...จะมีวิธีบล็อกคำสั่ง Batch File แต่ละภาษานั้นต้องใช้เครื่องหมายอะไรผู้เขียนจะอธิบายดังนี้
1. Java Script
@if (@X)==(@Y) @end
/* คำสั่งB Batch File ทั้งหมด */
@if (@X)==(@Y) @end คำสั่งนี้...จาว่ารู้ว่า...จุดใดคือเริ่่มสคริป จาว่า และ หยุด
ส่วน /* คือ เปิด Remark หรือหมายเหตุในภาษาจาว่าส่วน */ คือ ปิด Remark ในภาษา
ที่ขาดไม่ได้คือ
cscript //E:JScript //nologo %0
คำสั่งนี้...คือการเรียก cscript ภาษาจาว่าทำงาน

2. VBScript
rem^ & เป็นคำสั่ง Remark ในภาษาวีบีสคริป แต่ต้องตามหลังด้วย ^ & เพื่อให้แบตช์ไฟล์ ตีความว่าคำสั่ง Remark ที่มีเหมือนกันในภาษาวีบีและแบตช์ (ใช้ตัวเดียวกัน) ถูก

เชื่อมเข้ากับคำสั่งของ & เพื่อให้แบตช์ไฟล์ทำงาน ทั้งๆ ที่วีบีตีความเป็น Remark หรือ หมายเหตุอยู่นั้นเอง
ที่ขาดไม่ได้คือ
rem^ &cscript //nologo //e:vbscript %0
คำสั่งนี้...คือการเรียก cscript ภาษาวีบีทำงาน

3. Powershell
<# คือ Remark ของภาษา Powershell แต่ต้องปิดด้วย #> เพื่อให้แบตช์ไฟล์ทำงานได้อิสระ
ที่ขาดไม่ได้คือ
powershell -noprofile "iex (gc \"%~f0\" | out-string)"
คำสั่งนี้...คือการเรียก powershell ให้เรียกตัวมันทำงาน

คราวหน้าจะมาดูรูปแบบการทำ Hybird แบบ BASE64 กัน

ความคิดเห็น

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

รวมโปรแกรมทั้งหมดของ CatEye

ผม ธนัตถ์เดชน์   บุญลือลักษณ์ผู้เขียนและพัฒนาโปรแกรมบน Excel มาร่วมกว่า 3 ปี... โดยช่วงแรกๆ หลักจะให้ผู้ใช้งานได้โปรแกรมราคาถูก หรือ ฟรีไปเลย...แต่จากที่ผ่านมาเมื่อแจกโปรแกรมฟรีแล้วนั้น จะมีผู้แอบอ้างหรือผู้ที่อยากได้ Source Code ไปขายต่อหรือพัฒนาเพื่อการค้า ผมจึงเล่งเห็นว่า...ถ้าเป็นเช่นนั้น ผมจะคิดค่าใช้จ่ายสำหรับธุรกิจการค้าครับ...เพราะพวกคุณมีรายได้แต่ยังอาศัยช่องทางที่ผิดในการทำมาหากินอยู่...(ไม่ได้ Anti พวกใช้ Software เถื่อนนะครับ) บางครั้งธุรกิจต้องดำเนินอย่างถูกต้อง...ถ้ายังเริ่มต้นและยังไม่มีทุนคงไม่มีใครว่า...ที่จะขอแค่ใช้ไปก่อน แต่ถ้าเมื่อไหร่มีรายได้...ยังไงก็ขอให้ใช้โปรแกรมลิขสิทธ์ นะครับ ในบางกรณีเช่นนักศึกษาที่พัฒนาโปรเจ็คจบหรือ อาศัยฐานความรู้ของ โปรแกรมผมเพื่อการศึกษา จะยกเว้นเป็นกรณีพิเศษ ครับ...ไม่มีค่าใช้จ่าย...แต่ต้องลงทะเบียนและขอภาพบัตรนักศึกษามายืนยันนิดนึง...ลิขสิทธิ์จะยกเว้นสำหรับองค์ความรู้ของนักเรียนนักศึกษาครับเป็นไปตามระบบสากล

ภายใต้หน้ากากแมว จากผู้หลงผิดและคิดว่าตัวเองเป็นศูนย์กลางจักรวาล...ผมเองเคยผ่านเรื่องที่เลวๆ เช่นการทดสอบและปล่อยไวรัสใน Macro เมื่…

ปูพื้นฐาน Batch File และการแสดงผลภาษาไทย Windows 10

ปูพื้นฐานก่อนเขียน Batch Files
ใช้คอมมาถึงยุคปัจจุบัน...ก็ร่วม 20 ปี... "Disk Operating System หรือ DOS" มันได้สูญพันธ์ไปแล้วจริงหรือ คำตอบออกมาจากหัว "เสียงดังมาก" ว่า "ไม่ใช่!" แต่ในความเป็นจริงของโลกยุคปัจจุบัน "ใช่แล้วปู่!" สังเกตได้จากแผ่น "ดิสก์เก็ต 5 นิ้ว มันตายไปกับไดโนเสาร์แล้ว พร้อมๆ กับแผ่น 3 นิ้ว มันก็จะสูญพันธ์ไปพร้อม ช้างแมมมอส และที่กำลังจะสูญพันธ์ตามไปคือแผ่น CD-ROM อีกไม่นาน(เพราะไดร์ฟมันไม่มีแล้ว)" และเราใช้อะไรบูตเครื่องแทน DOS กัน คำตอบคือ ถ้า ระบบปฏิบัติการวินโดวส์เอง คือ "แกนวินโดวส์; Kernal" (ยังไม่ขอพูดถึงระบบมัน) ตัวของวินโดวส์ตั้งแต่ยุค 98 จนถึง Me เวลาซ่อมเครื่องยังต้องอาศัยแผ่น StartUp ซึ่งนั้นแหละคือระบบปฏิบัติการ DOS ย่อส่วน (แค่นั้นมันก็รวมคำสั่ง DOS ไว้เกือบครึ่ง) จนมาถึง XP ระบบการสร้าง Start Up Disk ได้หายไปพร้อมกับ ระบบที่ ไม่ต้องการ Command.com, IO.SYS, MS-DOS.SYS อีกต่อไป (และทำไมมันยังอยู่ในไดร์ฟระบบเช่น C:\>) มันเหลือแค่มีไว้ประดับบารมีของ XP ครับ... บูตจริงๆ มันบูตไม่ขึ้น... เพราะระบบ…

กำเนิดไวรัสคอมพิวเตอร์

(Lady Augusta Ada Byron, Coutress of Lovelace ) โปรแกรมเมอร์คนแรกของโลกเธอบรรจงถักทอผ้าผ่านโปรแกรมคำสั่งคอมพิวเตอร์ด้วยลายผ้าอันวิจิตรงดงาม...คงนึกไม่ถึงว่า...ลายผ้าสมัยนี้...จะน่ากลัวสักเพียงใดหากไวรัสคอมพิวเตอร์ปรากฎอยู่บนพื้นผ้าของเธอในสมัยนั้นด้วย

2488: วันหนึ่ง Rear Admiral Grace Murray Hopper พยายามสั่งให้คอมพิวเตอร์ทำงาน แต่ทำยังไงมันก็ไม่ยอมทำงาน เธอจึงเข้าไปดูในฮาร์ดแวร์(สมัยนั้นคอมพิวเตอร์มีขนาดใหญ่มาก เกือบเท่าห้องๆ หนึ่ง) ก็เจอผีเสื้อกลางคืนติดอยู่ในนั้น ซึ่งเธอเรียกมันว่า "Bug" ซึ่งคำนี้ได้ใช้กันมาจนถึงปลายศตวรรษที่ 19 ซึ่งหมายถึงปัญหาที่เกิดขึ้นกับอุปกรณ์อิเล็คโทรนิคต่างๆ Murray Hopper ก็ยังได้สร้างคำขึ้นมาใหม่อีกคำหนึ่งคือ "Debugging" ซึ่งได้อธิบายถึงความพยายามที่จะแก้ปัญหาที่เกิดขึ้นกับคอมพิวเตอร์

2492:  นักวิทยาศาสตร์ชาว Hungarian ที่ชื่อว่า John von Neumann ได้คิดค้นทฤษฎีของโปรแกรมที่สามารถทำซ้ำตัวเองได้ ซึ่งพื้นฐานของโปรแกรมนี้เกี่ยวกับการใช้หน่วยความจำของเครื่องนั่นเอง ในหนังสือชื่อ "Therory and Organization of Complicated Automata"
 (ลัก…