[技巧分享]多条Shell语句执行导致判断出错的解决办法
时间:2013-07-04 23:21 来源:Office中国 作者:Access中国tmtony 阅读:次
问题:
_________________________________________________________________
我在一个模块中的一个过程中写了以下几句代码:
Shell "net use z: \\qmxmaster\D$ "
Shell "xcopy w:\bakData z:\pxsystem\bakData\ /e /c /y", 0
Shell "net use z: /del"
w:是局域网中A计算机本来就设置的一个网络驱动器,映射B计算机的一个
共享文件夹。z:是通过代码临时在A机器建立的另一个网络驱动器,指向B
计算机的d盘。
在A计算机运行这个过程,把w:\bakData文件夹中全部文件拷贝到B计算机
(机器名pxmaster) 的D盘 bakData文件夹中。
现在前两步都做到了,可以建立文件夹并拷贝,但是第3句却不起作用,驱动
器z总是不能消失,可是 我把第3句放到命令行是能够正常执行的。何故?
是不是考贝时间过长(5-6秒),代码不执行?是否可以让代码执行有一个等待
过程?
解决(tmtony Office中国/Access中国):
_____________________________________________________________
应该是等待时间过长. 两种方法
1.Shell("命令", vbHide, True) 最后参数为true 这个可选参数设为True就可以让Shell执行完才接着Shell下边的代码
2.使用API来判断 建立以下的代码
Option Explicit
'等待shell执行完成后才执行下一条代码
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命令并等待程序执行完毕 再返回控制权才继续执行下一句代码
Private Sub Command1_Click()
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数
pId = Shell("http://www.office-cn.net") ' Shell 传回 Process Id
pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
DoEvents ' doevents
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE) ' 无限等待,直到程序结束
Call CloseHandle(pHnd)
End If
MsgBox "执行完毕 "
End Sub
_________________________________________________________________
我在一个模块中的一个过程中写了以下几句代码:
Shell "net use z: \\qmxmaster\D$ "
Shell "xcopy w:\bakData z:\pxsystem\bakData\ /e /c /y", 0
Shell "net use z: /del"
w:是局域网中A计算机本来就设置的一个网络驱动器,映射B计算机的一个
共享文件夹。z:是通过代码临时在A机器建立的另一个网络驱动器,指向B
计算机的d盘。
在A计算机运行这个过程,把w:\bakData文件夹中全部文件拷贝到B计算机
(机器名pxmaster) 的D盘 bakData文件夹中。
现在前两步都做到了,可以建立文件夹并拷贝,但是第3句却不起作用,驱动
器z总是不能消失,可是 我把第3句放到命令行是能够正常执行的。何故?
是不是考贝时间过长(5-6秒),代码不执行?是否可以让代码执行有一个等待
过程?
解决(tmtony Office中国/Access中国):
_____________________________________________________________
应该是等待时间过长. 两种方法
1.Shell("命令", vbHide, True) 最后参数为true 这个可选参数设为True就可以让Shell执行完才接着Shell下边的代码
2.使用API来判断 建立以下的代码
Option Explicit
'等待shell执行完成后才执行下一条代码
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命令并等待程序执行完毕 再返回控制权才继续执行下一句代码
Private Sub Command1_Click()
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数
pId = Shell("http://www.office-cn.net") ' Shell 传回 Process Id
pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
DoEvents ' doevents
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE) ' 无限等待,直到程序结束
Call CloseHandle(pHnd)
End If
MsgBox "执行完毕 "
End Sub
(责任编辑:admin)
顶一下
(3)
100%
踩一下
(0)
0%
相关内容
- ·API函数详细解释
- ·Access从剪切版里复制和粘贴数据
- ·Access利用api实现打开/关闭光驱
- ·应用程序开机自动启动(注册表操作技巧
- ·Access VBA 判断网络是否连通的多种办
- ·什么是ADP,了解ADP的优缺点
- ·优秀产品大全--通用票据打印软件(新)
- ·[技巧分享]多条Shell语句执行导致判断
- ·在access中可以调用API函数GetFileInfo
- ·Access API集中营--增加临时使用的字体
- ·API ShellExecute 功能说明及应用示例
- ·在VB中使用API函数(什么是API? )
- ·API实现完美的图片出现效果(转)
- ·API 设置调整系统当前时间
- ·如何检测以及设置键盘状态
- ·不关闭当前数据库COPY当前数据库
最新内容
推荐内容