วันอังคารที่ 2 กรกฎาคม พ.ศ. 2556

การสั่งรันแบบจำลอง MIKE 11 ด้วย batch file

การใช้ 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 ได้เช่นกัน

====================================================================

'Option Explicit

'--------------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
====================================================================

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

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