วันอังคารที่ 26 สิงหาคม พ.ศ. 2557

การเขียนแบตช์ไฟล์เพื่อแสดงผลใน HTML Application ตอนที่ 2

วันนี้นั่งแกะ HTML ครึ่งวัน...จะทำ Explorer ฉบับ Console เล่นเอาซะเหนื่อย ไม่ถนัด VBScript ที่มันติดนั่นติดนี่ แต่ก็เดาทางจนจบ...หลายๆ คนอยากเขียนแบตช์ไฟล์ให้สามารถทำงานร่วมกับ HTML Application โดยใช้ Environment โอย...ยากมาก...ยังเดาทางมันไม่ได้เลย...เพราะการโปรเซสของมันแยกคนละเซกชั่น...หากนำมารวมกัน...มันยากมาก...และถ้ามีการประมวลผล...หลายแบตช์ไฟล์พร้อมกัน...มั่วแน่..ๆ ครับท่าน...เลยใช้วิธีเดิม...คือโยน Parameter ระหว่างกันซะ...โดยโปรแกรมที่สร้างขึ้นมาด้วย VBScript จะรับการทำงานของแบตช์รอการเรียกใช้งานผ่าน Parameter 3 (เทียบได้กับ Parameter1 ของแบตช์ไฟล์) ถ้าไม่มีการเรียกมาจากแบตช์ไฟล์โปรแกรมจะไม่ทำงาน...ถ้ามีการส่งชื่อโปรแกรมแบตช์ไฟล์ที่เรียกใช้...มันจะโยนค่าแฟ้มที่เลือกผ่านโปรแกรมไปยังแบตช์ไฟล์ที่เรียกเท่านั้น...เพื่อไม่ให้เกิดการทำงานที่ชนกัน...หรือเขียนทับเส้นทาง...ตัวอย่าง...
โปรแกรมนี้...จะทำหน้าที่เป็นเมนูให้แบตช์ไฟล์เลือกไฟล์ที่อยู่ในคอมพิวเตอร์และโยนชื่อแฟ้มที่เลือกให้แบตช์ไฟล์นำไปใช้งานต่อ...นั้นเอง...(ธีม...แบบ Monochrome อีกแล้ว) โปรแกรมสามารถมีแถบเมนูให้เลือกด้วยเมาส์...ไม่ต้องละมือไปจับแป้นคีย์ใดๆ เพื่อให้การเขียนแบตช์ข้ามขีดความสามารถแบบยุคคุณปู่ไป...ตัวอย่าง...
ส่วนภาษาไทยนะเหรอ...ลองรับทุกสถานการณ์...ฮ่าฮ่า...(แต่เมื่อโยนไปที่แบตช์ไฟล์แล้ว...ตัวใครตัวมัน)
คุณสามารถใช้คำสั่ง Ctrl+F เพื่อหาข้อความภายใน HTML แบบเดียวกับหน้าเวป...เพื่อช่วยหาแฟ้มข้อมูลที่มีหลายๆ บรรทัดได้เช่นกัน ที่นี้...การเขียนแบตช์ไฟล์ให้เป็น Hi-End ก็จะเริ่มก็ตัวขึ้นล่ะทีนี้...
โค้ด...แจกฟรี...และ Open Source เช่นเดิม...

ถ้าจะทดสอบ...ให้บันทึกชื่อ XFile.HTA

<HTML>
 <HEAD>
 <HTA:APPLICATION ID="FileBrowser"
    APPLICATIONNAME="FileBrowser"
    WINDOWSTATE="normal"
    SINGLEINSTANCE="no"
 >
 <TITLE>กรุณาเลือกไฟล์</TITLE>
  <style type="text/css">
   ul { list-style-type:none; margin:1; padding:1; padding-top:7px; padding-bottom:5px; }
   li { display:inline; }
   a:link,a:visited { color:#00FF00; background-color:Black; }
   a:hover,a:active { color:Black; background-color:#00FF00; }
 </style>
 <SCRIPT LANGUAGE="VBScript">
  public A1
  Sub window_onLoad()
    Dim arrCommands
    arrCommands = Split(FileBrowser.commandLine, chr(34))
    For i = 3 to (Ubound(arrCommands) - 1) Step 2
        A1 = arrCommands(i)
    Next
If A1 = "" Then
 msgbox "กรุณาสารระบบ  Batch File ที่จะรับพารามิเตอร์"
Else
      Call ListDrive()
      Call DoList()
End If
  End Sub

 Function ListDrive()
   Dim objFSO, colDrives, N
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set colDrives = objFSO.Drives
   N = 0
   For Each objDrive in colDrives
     N = N + 1
     ShowDrive.innerhtml = showDrive.innerhtml & "<a href=#Top onClick=ChangeDrive(" & chr(34) & objDrive.DriveLetter & ":" & chr(34) & ")>" & objDrive.DriveLetter & ": </a>"
   Next
 End Function

 Sub DoList()
  Dim SubDir, N, fso, fPath, O
  Set fso = CreateObject("scripting.FilesystemObject")
  fPath = CDir()
  Set folder = fso.getfolder(fPath)
  ShowDir.innerhtml = "<a href=#Top onClick=BackDir()>\..</a><br>"
  ShowFile.innerhtml = ""
  N = 0
  For Each f in folder.subfolders
    N = N + 1
    SubDir =  mid(f.path, instrrev(f.path,"\"))
    ShowDir.innerhtml = ShowDir.innerhtml & "<a href=#Top onClick=ChangeDir(" & N & ")>" & SubDir & "</a><br>"
  Next
  O = 0
  For Each f in folder.files
    O = O + 1
ShowFile.innerhtml = ShowFile.innerhtml & "<a href=#Top onClick=SelectFile(" & O & ")>" &  f.name & "</a><br>"
  Next
  PathDir.innerhtml = CDir()
 End Sub

 Function ChangeDir(N)
  Dim O, fPath, objShell
  Set fso = CreateObject("scripting.FilesystemObject")
  Set objShell = CreateObject("Wscript.Shell")
  fPath = CDir()
  Set folder = fso.getfolder(fPath)
  O = 0
  For Each f in folder.subfolders
    O = O + 1
    If N = O Then
 objShell.CurrentDirectory = f.path
 Call DoList()
End If
  Next
 End Function

 Function BackDir()
  Dim objShell, FolPath, f
  FolPath = CDir()
  f = left(FolPath,InstrRev(FolPath,"\")-1)
  If Len(f) < 3 Then f = f & "\"
  Set objShell = CreateObject("Wscript.Shell")
  objShell.CurrentDirectory = f
  Call DoList()
 End Function

 Function CDir()
   Set WshShell = CreateObject("WScript.Shell")
   CDir = WshShell.CurrentDirectory
 End Function

 Function ChangeDrive(Drive)
  Set objShell = CreateObject("Wscript.Shell")
  objShell.CurrentDirectory = Drive
  Call DoList()
End Function

 Function SelectFile(O)
  Dim P, fPath, objShell, fso, WshShell, WS
  Set WshShell = CreateObject("WScript.Shell")
  Set fso = CreateObject("scripting.FilesystemObject")
  Set objShell = CreateObject("Wscript.Shell")
  fPath = CDir()
  Set folder = fso.getfolder(fPath)
  Set WS=CreateObject("WScript.Shell")
  P = 0
  For Each f in folder.files
    P = P + 1
    If O = P Then
 If Len(fPath) > 3 Then
        WS.Run "cmd /c " & A1 & " " & chr(34) & fPath & "\" & f.name & chr(34)
 Else
        WS.Run "cmd /c " & A1 & " " & chr(34) & fPath & f.name & chr(34)
 End If
End If
  Next
  WshShell.SendKeys "%{F4}"
 End Function

 </SCRIPT>
</HEAD>
<BODY bgcolor="Black">
 <FONT FACE="MS Sans Serif" SIZE=2 COLOR=#00FF00>
 <div id=Top></div>
 <div id=ShowDrive>ไดร์ฟ-></div>
 <hr color=#00FF00>
 <div id=PathDir></div>
 <hr color=#00FF00>
 <div id=ShowDir></div>
 <hr color=#00FF00>
 <div id=ShowFile></div>
 </FONT>
</BODY>
</HTML>

มาถึงการเรียกใช้งานกัน...
นี้คือคำสั่งที่ทดสอบเรียกแฟ้ม XFile.HTA ทำงาน
:: Test Explorer.BAT
@echo off
if "%1" == "" XFile.hta %0
if not "%1" == "" echo %1 & pause
goto :EOF
ด้านบนรับพารามิเตอร์แบบ วรรคไม่ได้
:: Test Explorer.BAT
@echo off
if '%1 == ' XFile.hta %0
if not '%1 == ' echo %1 & pause
goto :EOF
ทีนี้...รับค่าโปรแกรมได้แล้ว...

แบตช์ไฟล์สามารถรับการประมวลผลแบบข้ามเซกชั่้น...แต่คุณต้องเขียนแบตช์ไฟล์แบบแยกโมดูลและจบท้ายด้วย goto :EOF เพื่อให้มันทำงานแยกเป็นโมดูล ๆ ไป...วันหน้าจะมาสอนเขียนให้มันซับซ้อนอย่าง ที่สุดของการทำงานระดับ Hi-End

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

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