vb中shell使批处理完成后再执行后续指令

我想在vb的Form中,点击Command1后自建并运行一个bat批处理文档,运行完后弹出一个msgbox提示完成,代码如下:PrivateSubCommand1_Cli... 我想在vb的Form中,点击Command1后自建并运行一个bat批处理文档,运行完后弹出一个msgbox提示完成,代码如下:

Private Sub Command1_Click()
Open "C:\test.bat" For Output As #1
Print #1, "@echo off"
Print #1, "echo 测试完毕"
Print #1, "echo. & pause "
Close #1
Shell "c:\test.bat"
MsgBox "清理完成!"
End Sub

可是测试时发现Msgbox还没等批处理文件运行完就弹出来了,到网上一查才直到Shell函数是异步执行程序,找到很多方法都没能解决,请高手帮助我,把我的代码修改以下,要求代码中的这个Bat批处理文档运行完成后才弹出Msgbox,谢谢!
我重述一下:我的目的是点击Command1后程序自建一个Bat批处理文档并运行,建立这个Bat批处理文档的代码如下:
Open "C:\test.bat" For Output As #1
Print #1, "@echo off"
Print #1, "echo 测试中,删除的文件是垃圾文件,不会损坏系统"
Print #1, "del /f /s /q %systemdrive%\*.tmp"
Print #1, "del /f /s /q %systemdrive%\*._mp"
Print #1, "del /f /s /q %systemdrive%\*.log"
Print #1, "del /f /s /q %systemdrive%\*.gid"
Print #1, "echo exit"
Close #1
建立完毕后程序用shell函数(用其它的也可以)运行这个批处理文件,等批处理文件执行完毕退出时再用Msgbox弹出一个提示窗口提示测试完成
如果用Shell函数,则Msgbox和这个BAT文档是同时弹出的
请各位帮忙实现 批处理文档建立并运行完毕退出后,才弹出提示窗口
评价:
信闯 想法不错,如果没有人会回答 我会考虑这个方法
cjsworld 我要的效果是bat运行结束立即弹出窗口,而且这个bat运行结束的时间是个未知数,采用延时代码难免出现误差
ljl88900 我用你的代码试了下,还是不行啊
展开
 我来答
excel712
2008-07-28 · TA获得超过329个赞
知道小有建树答主
回答量:250
采纳率:0%
帮助的人:0
展开全部
Option Explicit
'shell and wait示例
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103

Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFFFFFF
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

'shell and wait
'执行外部命令并等待程序执行完毕再返回控制权
Private Sub Command1_Click()
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数

pId = Shell("F:\1.bat") ' Shell 传回 Process Id

pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle

DoEvents
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE) ' 无限等待,直到程序结束
Call CloseHandle(pHnd)
End If
MsgBox "执行完毕 "

End Sub
我是雨之痕
2008-07-28 · 超过24用户采纳过TA的回答
知道答主
回答量:112
采纳率:0%
帮助的人:56.1万
展开全部
我也不太明白,不过我有些思路,就是说呢,用一个TIMER来监视一些,你批处理里最后的一个改动,比如说,修改一个文件的名字,在你按按钮的同时,开动时钟控件,然后,MsgBox "清理完成!"
放在timer1里,这样就OK了,不知这样的思路行不行,如果是我,就这样办,也许有更好的办法 思路有了,你可以自己找一下相关的代码,主要是查文件名的代码

对了,忘了,在时钟控件生效前一定要让要改的那个文件名复位,这样不至于出错,我想你也能想到,但我还是想补充一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ljl88900
2008-07-28 · TA获得超过2661个赞
知道大有可为答主
回答量:2197
采纳率:100%
帮助的人:2638万
展开全部
'这样就可以满足你的要求:
Private Sub Command1_Click()
Open "C:\test.bat" For Output As #1
Print #1, "@echo off"
Print #1, "echo 测试完毕"
Print #1, "echo. & pause "
Close #1
Dim wshshell
Set wshshell = CreateObject("WScript.Shell")'创建脚本对象
wshshell.run "c:\test.bat"
Set wshshell = Nothing'释放内存
MsgBox "清理完成!"
End Sub
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cjsworld
2008-07-28 · TA获得超过151个赞
知道小有建树答主
回答量:115
采纳率:0%
帮助的人:138万
展开全部
shell函数有一定运行时间,这样修改:

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
Open "C:\test.bat" For Output As #1
Print #1, "@echo off"
Print #1, "echo 测试完毕"
Print #1, "echo. & pause "
Close #1
Shell "c:\test.bat", vbNormalFocus
Sleep 500 '按实际情况设定时间,单位是毫秒
Form1.SetFocus
MsgBox "清理完成!"
End Sub
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ickaka
2008-07-28 · TA获得超过323个赞
知道小有建树答主
回答量:358
采纳率:0%
帮助的人:0
展开全部
这个问题好啊。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式