.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
编程中灵活使用批处理文件

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

我们经常会遇到这样的问题,例如要按次序执行几个程序,不是同时执行,也不是依次打开,而是当第一个程序执行完毕后再执行第二个,接着是第三个,等等等等。在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)的结果是半角的双引号。贴主对于问题的解决表示满意。

这仅仅是批处理文件在编程应用中的一个例子。在编程中灵活的使用批处理文件,可以大大的减轻编程的负担和提高程序的效率。




相关文章

相关软件