วันศุกร์ที่ 12 กรกฎาคม พ.ศ. 2556

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

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

Matrix แบบง่าย...? 

@echo off
title loop example
color 0A
:Loop
for %%a in (
  "1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0"
  "1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1"
  "0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0"
  "0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 1"
  "1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1"
  "1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0"
) do (
  echo %%~a
)
goto :Loop

จากคำสั่ง...จะเห็นว่า...มันก็ง่ายๆ ไม่ต้องไปคำนวนอะไรให้ซับซ้อนก็แค่แสดง 0 กับ 1 วนไปวนมา...ไม่ถึงกับต้องคำนวนให้วุ่นวายอย่างหลายๆ ตัวอย่าง...ของบางคน...

Logo แบบ ไฟฟ้าซ็อต?
มาถึงสิ่งที่ผมภูมิใจนำเสนอ...บางเวปนั้นการทำไฟซ็อตหน้าจอ...อาจจะต้องใช้คำสั่งเกี่ยวกับ Debug แต่ผมว่ามันไม่จำเป็นใดๆ ทั่งนั้น...เพียงอาศัยคำสั่ง color และวนลูป แค่นี้...มันก็ทำให้อะไรที่ดูว่ายากกลับง่ายในพริบตา...

*** การจับภาพน่าจอ...อาจเร็วกว่าอัตรากระพริบของตัวหนังสือ...ตัวอย่างจึงไม่สามารถแสดงสีได้สมจริง

@echo off
ECHO   _/_/_/  _/_/_/_/_/_/_/_/_/_/_/_/_/    _/_/_/_/_/
ECHO _/      _/    _/    _/    _/      _/    _/_/    
ECHO _/      _/    _/    _/    _/_/_/    _/_/  _/_/_/
ECHO _/      _/_/_/_/    _/    _/          _/  _/    
ECHO _/_/_/_/_/    _/    _/    _/_/_/_/    _/  _/_/_/_/
:Loop
for %%a in (08 09 0a 0b 0c 0d 0e 0f) do (
color %%a
ping 0.0.0.0 -n 1>nul
)
goto :Loop

การยืดหดกรอบ CMD แบบเคลื่อนไหว...?
บางครั้งการเปิดตัว Batch File อยากให้อลังการณ์ จึงต้องให้มันมีการเคลื่อนไหวยืดหดหน้าจอได้เหมือนในหนัง...ซึ่ง Batch File เองก็ทำได้ครับตามนี้ นำโค้ดไปวางใน Batch File ที่ต้องการ จากนั้นเวลาเรียกใช้ให้เรียก Call :ShowMode /s เพื่อให้กรอบแสดงจากเล็กมาใหญ่...และ Call :ShowMode /e เพื่อปิดท้ายการเมื่อจบโปรแกรมคือ แสดงกรอบจากใหญ่มาหาเล็ก และหายไปครับ...

:ShowMode %1
@echo off
if "%1"=="/s" goto :StartCMD
if "%1"=="/e" goto :EndCMD
goto :HelpShowMode
:StartCMD
set b=27
for /l %%a in (0,1,25) do (
  call :SetModeStartCMD %%a
  ping 0.0.0.0 -n 1>nul
)
set b=
goto :EOF
:SetModeStartCMD %1
  set /a b=^%b%+2
  mode %b%,%1
goto :EOF
:EndCMD
set b=80
for /l %%a in (25,-1,0) do (
  call :SetModeEndCMD %%a
  ping 0.0.0.0 -n 1>nul
)
set b=
goto :EOF
:SetModeEndCMD %1
  set /a b=^%b%-2
  mode %b%,%1
goto :EOF
:HelpShowMode
echo ShowMode /s = Start Batch File
echo          /e = End Batch File
goto :EOF


วันจันทร์ที่ 8 กรกฎาคม พ.ศ. 2556

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

คำสั่ง Browse Folder?
บางครั้งแบตช์ไฟล์เองก็ไม่สามารถที่จะเลือกโฟลเดอร์ที่ต้องการได้...หรือถ้าเขียนเป็นคำสั่งให้เลือกแบบ คลิก หรือ Pull Down เองก็ยากและซับซ้อนมากทางเลือกก็คืออาศัย Visual Basic ซะ...จะได้หมดปัญหา...มาดูกันว่าคำสั่งนี้ทำงานอย่างไร

คำสั่ง
@echo off
call :BrowseFolder
set /p p=Path File Name : 
pause
goto :EOF

:BrowseFolder
( echo Set SA = CreateObject^("Shell.Application"^)
  echo Set WS = WScript.CreateObject^("WScript.Shell"^)
  echo Set SAB = SA.BrowseForFolder^(0, "กรุณาเลือกโฟลเดอร์เป้าหมาย", 1, "c:\Programs"^)
  echo WS.SendKeys SAB+"{Enter}"
)>BrowseFolder.vbs
start BrowseFolder.vbs

คำสั่ง Massage Box เพื่อแสดงกล่องข้อความ?
หลายครั้งที่ต้องติดต่อผู้ใช้งานเพื่อตัดสินใจในการทำงาน...ต่างๆ และ Batch File เองก็ไม่สามารถตอบโจทย์ได้อย่างเต็มที่...จึงมีทางเลือกคืออาศัย Visual Basic อีกเช่้นกัน...แต่คำสั่ง MsgBox ของ Visual Basic นั้นซับซ้อนยุ่งยาก...มีเงือนไขเยอะ...จึงต้องเขียน Batch File ให้มีพารามิเตอร์เลือกทำงานตามรูปแบบที่ถูกต้อง และแสดงข้อความช่วยเหลือ...หากใช้คำสั่งผิดไป...

คำสั่ง...
@echo off
call :MsgBox "เลือกปุ่ม ที่ท่านต้องการ" /ync /c
set /p YesNo=Buttons : 
pause

:MsgBox
for %%a in (%1 %2 %3) do (
  if "%%a"=="" goto :HelpMsgBox
)
if "%2"=="/oo" set buttons=0 & goto :MsgBox2
if "%2"=="/oc" set buttons=1 & goto :MsgBox2
if "%2"=="/ari" set buttons=2 & goto :MsgBox2
if "%2"=="/ync" set buttons=3 & goto :MsgBox2
if "%2"=="/yn" set buttons=4 & goto :MsgBox2
if "%2"=="/rc" set buttons=5 & goto :MsgBox2
goto :HelpMsgBox
:MsgBox2
if "%3"=="/c" set icon=16 & goto :MsgBox3
if "%3"=="/q" set icon=32 & goto :MsgBox3
if "%3"=="/e" set icon=48 & goto :MsgBox3
if "%3"=="/i" set icon=64 & goto :MsgBox3
goto :HelpMsgBox
:MsgBox3
set /a Information=%icon%+%buttons%
( echo Set WS = WScript.CreateObject^("WScript.Shell"^)
  echo r=Msgbox^("%~1",%Information%, "กล่องข้อความโดย ธนัตถ์เดชน์  บุญลือลักษณ์"^)
  echo select case r
  echo case 1
  echo   b="OK"
  echo case 2
  echo   b="Cancel"
  echo case 3
  echo   b="Abort"
  echo case 4
  echo   b="Retry"
  echo case 5
  echo   b="Ignore"
  echo case  6
  echo   b="Yes"
  echo case  7
  echo   b="No"
  echo end select
  echo WS.SendKeys b+"{Enter}"
)>MsgBox.vbs
start MsgBox.vbs
goto :EOF
:HelpMsgBox
  echo MsgBox "Message" /[Buttons] /[Icon]
  echo Buttons is  /oo  = OKOnly
  echo             /oc  = OKCancel
  echo             /ari = AbortRetryIgnore
  echo             /ync = YesNoCancel
  echo             /yn  = YesNo
  echo             /rc  = RetryCancel
  echo Icon is     /c = Critical
  echo             /q = Question
  echo             /e = Exclamation
  echo             /i = Information
goto :EOF

เทคนิคเหล่านี้...ลองนำไปประยุกต์ต่อนะครับ...และผมจะมานำเสนอเทคนิคใหม่ๆ เกี่ยวกับ Batch File และยังคงอาศัย VB Script ทำงานอยู่เช่นเดิม...เพื่อให้ Batch File สามารถทำงานแบบข้ามขีดจำกัดได้...

วันจันทร์ที่ 1 กรกฎาคม พ.ศ. 2556

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

ฟังกชั่นเปอร์เซ็นต์แสดงการโหลดหรือทำงาน?

การเรียกใช้งาน
@echo off
title Process bar Batch File
for /l %%a IN (0,1,100) do (
  call :ShowPercent %%a
)
set a=
set b=
set p=
goto :EOF

:ShowPercent %1
mode 51,5
color b
set /a a=(%1/2)
set /a b=%1-(%1/2)
if %a% lss %b% (set p=%p%^#)
cls
echo ==================================================
echo %p%
echo ==================================================
echo                         %1%% 
ping 0.0.0.0 -n 1 -w 1 >nul
goto :EOF


ฟังก์ชั่้นนี้...เหมาะสำหรับแสดงการทำงาน...โดยค่าสูงสุดอยู่ที่ 100 ส่วนต่ำสุดอยู่ที่ 0 ครับ อาจแสดง...หลอกๆ ตามตัวอย่างก็ได้

การติดต่อสื่อสารระหว่าง VBScript กับ Batch File?
ตัวอย่างสคริป VBScript
set WS=CreateObject("WScript.Shell") ' กำหนดคำสั่ง Shell
set WSE=WS.Environment ' กำหนด Eliment ตัวแปร
WSE("TestVar") = "ข้อมูลภายในตัวแปร" ' กำหนดข้อมูลตัวแปร TestVar 
msgbox "TestVar = " & WS.ExpandEnvironmentStrings("%TestVar%") ' แสดงค่าในตัวแปร
rem WSE.Remove "TestVar" ' ล้างตัวแปร TestVar

บรรทัดสีน้ำเงินแสดงถึงคำสั่งของ VฺBScript ซึ่งสามารถส่งค่า Environment ผ่านมายัง Batch File ได้...จึงทำให้ Batch File นั้นสามารถใช้ประโยชน์ VBScript ได้เช่นกัน

การรับข้อมูลของ Batch File ผ่าน VBScript?
โดยปกติแล้ว...Batch File สามารถรับข้อมูลที่ Console ได้เลยดังนี้
set /p ตัวแปร=ข้อความแสดง{วรรค}
เช่น
set /p Name=Enter Your Name : 
ทีนี้...ไม่สามารถแสดงผลภาษาไทยได้...เลยต้องประยุกต์ VBScript มาดังนี้

@echo off
call :InputBOX
set /p a=Enter : 
msg %username% %a%
goto :EOF

rem ฟังก์ชั่นสร้าง VBScript เพื่อรับภาษาไทย
:InputBOX
( echo dim str
  echo set WS=CreateObject^("WScript.Shell"^)
  echo str = inputbox^("กรุณากรอกข้อมูล"^)
  echo WS.SendKeys str+"{Enter}"
)>Inputbox.vbs
start inputbox.vbs
goto :EOF