我们经常会遇到这样的问题,例如要按次序执行几个程序,不是同时执行,也不是依次打开,而是当第一个程序执行完毕后再执行第二个,接着是第三个,等等等等。在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)的结果是半角的双引号。贴主对于问题的解决表示满意。
这仅仅是批处理文件在编程应用中的一个例子。在编程中灵活的使用批处理文件,可以大大的减轻编程的负担和提高程序的效率。