วันพฤหัสบดีที่ 8 มีนาคม พ.ศ. 2561

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 กัน

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

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

โปรแกรมฟรีๆ สำหรับผู้เริ่มต้นธุรกิจ

Software ราคาถูก สำหรับผู้เริ่มต้นธุรกิจ สวัสดีครับ...ผมนายธนัตถ์เดชน์   บุญลือลักษณ์ (Tanutdech  Boonluelak) เป็นผู้เขียนและพัฒนาซอฟต์แ...