การใช้ batch file ในการรันโปรแกรม MIKE 11 สามารถนำไปประยุกต์ใช้งานได้หลากหลาย
สำหรับบทความนี้จะนำเสนอการสร้าง bat ที่สามารถสั่งรันแบบจำลอง MIKE 11 ได้
ก่อนที่จะดำเนินการใช้งานการรันแบบจำลอง MIKE 11 ผ่าน bat ได้นั้น จะต้องมีการติดตั้งโปรแกรม
พร้อมกับมีแบบจำลอง MIKE 11 ที่จัดทำไว้เรียบร้อยแล้วก่อน
หลังจากนั้นให้เข้าไปที่ โฟลเดอร์ที่ได้ลงโปรแกรม MIKE 11 ไว้ ซึ่งโดยปกติจะอยู่ที่
C:\Program Files (x86)\DHI\2012\bin\mike11.exe หรือ
C:\Program Files (x86)\DHI\2012\bin\x64\mike11.exe หรือ
C:\Program Files\DHI\2012\bin\mike11.exe
และเมื่อใช้ command prompt รันโปรแกรม mike11.exe จะพบหน้าต่างบอกวิธีการใช้งานดังรูป
จะพบว่า เราสามารถใช้ Options ได้หลากหลายดังนี้
-b เป็นการตั้งค่าให้ปิดการเตือน error ทั้งหมด
-s เป็นการตั้งค่าให้ทำงานแบบซ่อนหน้าต่าง
-v เป็นการสั่งตรวจสอบข้อมูลการรันเท่านั้น ไม่มีการรันแบบจำลอง
-w แสดงความก้าวหน้าของการรัน โดยจะมีหน้าต่างขึ้นมาแสดง % ของการรัน
รูปแสดงตัวอย่าง option -w จะมีหน้าต่างแสดงความก้าวหน้าของงาน
ดังนั้น คำสั่งที่จะใส่ใน batch file จะมีลักษณะดังตัวอย่างด้านล่างนี้
"C:\Program Files (x86)\DHI\2012\bin\mike11.exe" -b -w "C:\DHI\Projects\test\test.sim11"
จากตัวอย่างข้างต้น สามารถนำไปประยุกต์ใช้ในกรณีต้องการใช้ batch ในการสั่งรัน MIKE11
ที่มีการเตรียมข้อมูลไว้พร้อมแล้ว หลายๆกรณี โดยไม่ต้องมารอสั่งรันทีละกรณี แต่สามารถ
เขียนคำสั่งใส่ไว้ใน batch ให้เรียบร้อย แล้วสั่งรันครั้งเดียว โดยตัว batch จะเป็นตัว
สั่งรันแบบจำลอง MIKE11 ไปทีละกรณี จนครบตามคำสั่งทั้งหมด
นอกจากนี้ ยังสามารถประยุกต์คำสั่งแบบเดียวกันนี้ในโปรแกรม Excel โดยการเขียน Macro ใน Excel
ให้สั่งรันแบบจำลอง MIKE11 ได้ด้วยเช่นกัน
ตัวอย่าง Code ด้านล่างนี้ เป็นคำสั่งเขียนด้วย Visual Basin ใน Excel
สำหรับการสั่งรันแบบจำลอง MIKE11
โดยให้รันและรอให้โปรแกรมรันเสร็จ จึงจะทำงานตามคำสั่งต่อไปใน Excel
สามารถไปประยุกต์ใช้ร่วมกับการทำงานเป็น Loop หรือ ทำงานร่วมกับปุ่มสั่งงาน Control button
ภายใน Excel เพื่อสร้างหน้ากากคลอบการทำงานของ MIKE11 ได้เช่นกัน
====================================================================
'--------------Shell API and Constants----------
Private Const WAIT_FAILED = -1&
Private Const WAIT_OBJECT_0 = 0
Private Const WAIT_ABANDONED = &H80&
Private Const WAIT_ABANDONED_0 = &H80&
Private Const WAIT_TIMEOUT = &H102&
Private Const INFINITE = &HFFFFFFFF ' Infinite timeout
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const SYNCHRONIZE = &H100000
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Sub Button1_Click()
Call selectfile
End Sub
Sub selectfile()
Dim str_search As String
Dim str_replace As String
Dim str_path As String
Dim m11 As String
Dim sim11 As String
Dim commandl As String
m11 = "C:\Program Files (x86)\DHI\2012\bin\mike11.exe"
sim11 = "C:\DHI\Projects\Test\Test.sim11"
commandl = "-b -w " + sim11 'silence without show error when end
aaa = ShellAndWait(m11, commandl, vbNormalNoFocus, -1) ' run model and wait it to finish
End Sub
'Purpose : Holds execution until application has closed.
'Inputs : sFilePath = The path to the application to run e.g. "Notepad.exe"
' [sCommandLine] = Any command line arguments
' [lState] = The Window State to run of the shelled program (A Long)
' [lMaxTimeOut] = The maximum amount of time to wait for the process to finish (in secs).
' -1 = infinate
'Outputs : Returns the True if failed open a process or complete within the specified timeout.
'Notes : Similiar to ShellAndHold, but will not get any 'spiking' effects using this method.
Function ShellAndWait(sFilePath As String, Optional sCommandLine, Optional lState As VbAppWinStyle = vbNormalFocus, Optional lMaxTimeOut As Long = -1) As Boolean
Dim lRetVal As Long, siStartTime As Single, lProcID As Long
'Check to see that the file exists
If FileExists(sFilePath) Then
'Add double quotes around the path (otherwise you can't use spaces in the path)
If Left$(sFilePath, 1) <> Chr(34) Then
sFilePath = Chr(34) & sFilePath
End If
If Right$(sFilePath, 1) <> Chr(34) Then
sFilePath = sFilePath & Chr(34)
End If
End If
'Start the shell
lRetVal = Shell(Trim$(sFilePath + " " + sCommandLine), lState)
'Open the process
lProcID = OpenProcess(SYNCHRONIZE, True, lRetVal)
siStartTime = Timer
Do
lRetVal = WaitForSingleObject(lProcID, 0)
If lRetVal = WAIT_OBJECT_0 Then
'Finished process
lRetVal = CloseHandle(lProcID)
ShellAndWait = False
Exit Do
ElseIf lRetVal = WAIT_FAILED Then
lRetVal = CloseHandle(lProcID)
'Failed to open process
ShellAndWait = True
Exit Do
End If
Sleep 100
If lMaxTimeOut > 0 Then
'Check timeout has not been exceeded
If siStartTime + lMaxTimeOut < Timer Then
'Failed, timeout exceeded
lRetVal = CloseHandle(lProcID)
ShellAndWait = True
End If
End If
Loop
End Function
'Purpose : Checks if a file exists
'Inputs : sFilePathName The path and file name e.g. "C:\Autoexec.bat"
'Outputs : Returns True if the file exists
Function FileExists(sFilePathName As String) As Boolean
On Error GoTo ErrFailed
If Len(sFilePathName) Then
If (GetAttr(sFilePathName) And vbDirectory) < 1 Then
'File Exists
FileExists = True
End If
End If
Exit Function
ErrFailed:
'File Exists
FileExists = False
On Error GoTo 0
End Function
'Purpose : Converts a File Name and Path to a Path
'Inputs : sFilePathName The path and file name e.g. "C:\Autoexec.bat"
'Outputs : Returns the path
Function PathFileToPath(sFilePathName As String) As String
Dim ThisChar As Long
For ThisChar = 0 To Len(sFilePathName) - 1
If Mid$(sFilePathName, Len(sFilePathName) - ThisChar, 1) = "\" Then
PathFileToPath = Left$(sFilePathName, Len(sFilePathName) - ThisChar)
Exit For
End If
Next
End Function
====================================================================
ไม่มีความคิดเห็น:
แสดงความคิดเห็น