1. 程式人生 > >程式設計中靈活使用批處理檔案

程式設計中靈活使用批處理檔案



我們經常會遇到這樣的問題,例如要按次序執行幾個程式,不是同時執行,也不是依次開啟,而是當第一個程式執行完畢後再執行第二個,接著是第三個,等等等等。在CSDN社群裡,使用者ww111222 就遇到了這樣的一個問題:如何按順序執行4個EXE程式。
一種解決的方案是使用特定的API啟動一個程式,監視它,不停的監視它,直到了解到它已經關閉了,再執行第二個。這種方法確實可行:如果你見過某些安裝程式的話,你會發現它們會在安裝過程中執行一個程式,等待它執行完畢再繼續安裝程序,但顯然這種方法比較麻煩。
同時,如果你還記得DOS時代有個批處理的概念的話(實際上,這個概念現在依然存在),你也許會和我一樣想到用批處理解決這個問題。在這個帖子中,我是這麼回答的:

假設4個DOS程式分別是1.exe,2.exe,3.exe,4.exe,都放在c:/下:
Private Sub Form_Load()
Dim sCmd As String
sCmd = "C:" & vbCrLf & "cd /" & vbCrLf & "1.exe" & vbCrLf & "2.exe" & vbCrLf & "3.exe" & vbCrLf & "4.exe"
Open "c:/1.bat" For Output As #1
Print #1, sCmd
Close #1
ShellExecute 0, "open", "c:/1.bat", vbNullString, vbNullString, vbNull
End Sub


程式的邏輯很簡單,編寫一個bat檔案,然後儲存到c:/下,接著使用ShellExecute API(如果不瞭解的話,請參考MSDN)執行它。後來我瞭解到,直接使用shell語句也可以達到相同的效果(執行bat檔案),而且來得更簡單。然後貼主提出,各個程式分別有它們的引數。我把程式修改了一下:

假設4個DOS程式分別是1.exe,2.exe,3.exe,4.exe,都放在c:/下;引數分別是param1,param2,param3,param4:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub Form_Load()
Dim sCmd As String
sCmd = "C:" & vbCrLf & "cd /" & vbCrLf & "1.exe /" & param1 & vbCrLf & "2.exe /" & param2 & vbCrLf & "3.exe /" & param3 & vbCrLf & "4.exe /" & param4
Open "c:/1.bat" For Output As #1
Print #1, sCmd
Close #1
ShellExecute 0, "open", "c:/1.bat", vbNullString, vbNullString, vbNull
End Sub

接下來使用者terry6394“狗尾續貂”了一下:如果你想執行之後還留下命令列視窗你可以這樣:

sCmd="C:" & vbcrlf & "cd /" & vbcrlf & "1.exe /" & param1 & vbcrlf & "2.exe /" & param2 & vbcrlf & "3.exe /" & param3 & vbcrlf & "4.exe /" & param4 & vbcrlf & "%SystemRoot%/system32/cmd.exe"

這個的思路是在批處理執行結束前再開啟一個命令列視窗,但是我懷疑它的可行性。舉個例子,開啟命令列視窗,輸入cmd,你得到的不是兩個命令列視窗,而是在原窗口裡cmd再執行了一遍。所以我認為這個視窗還是會關閉,但是我沒有真正的試過。
貼主下面提出的問題是,他需要在批處理結束後刪除批處理檔案,但是如果把 kill "c:/1.bat" 直接放到 shellexecute語句後面,就會導致批處理檔案還沒有執行完就被刪除了。我提出的建議是,修改如下一行為:

sCmd="C:" & vbcrlf & "cd /" & vbcrlf & "1.exe /" & param1 & vbcrlf & "2.exe /" & param2 & vbcrlf & "3.exe /" & param3 & vbcrlf & "4.exe /" & param4 & vbcrlf & "%SystemRoot%/system32/cmd.exe /c " & chr$(34) & "del c:/1.bat" & chr(34)

其中chr$(34)的結果是半形的雙引號。貼主對於問題的解決表示滿意。

這僅僅是批處理檔案在程式設計應用中的一個例子。在程式設計中靈活的使用批處理檔案,可以大大的減輕程式設計的負擔和提高程式的效率。