Wscript.shell 详解

本文详细介绍了Wscript.shell对象的功能及使用方法,包括模拟键盘输入、读写注册表、启动程序等,并提供了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Wscript.shell

Wscript.shell是Wshshell的ProID

Wshshell 是一个对象,存放在windows系统中的wshom.ocx文件 中,可供在windows上运行的程序调用。他可对windows的外壳程序进行访问。

对象(object)是一些相关变量和方法的软件集,或者说库。当你需要这个对象里面的变量,方法,功能的时候,你就可以使用相关语言(代码)来调用。

ProID 是程序员给某个CLSID指定的一个易记名字。组成如<Program>.<Componet>.<version>

CLSID 是windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的代码。为Class ID的缩写。

所以:代码   Set Obj = createobject("WScript.Shell") 得到对象Obj,即Wshshell,是一个对象

我们首先了解下对象Wscript : Windows Script Host object model (注意,前三个缩写为Wsh )

简单的说,Wscript就是Windows脚本宿主对象模型(WSHOM) , 而 Wscript就是windows内对象存放的一个根对象(官方语言:Wscript是一个基于windows系统脚本宿主对象的根对象), 利用它可以创造两种COM对象:WshShell 与 WshNetwork .

注释1:(八卦一下,不知道现在的诸如WshEnvironment, WshCollection, WshExec等对象是不是也存放在该根对象下,依照我的理解是的,因为他们都有前缀Wsh,但他们应该不是COM组件,故不再上面列出,应该是这样吧。另需注意Wsh是Wscript对象内置的变量,故在你载入WshShell后,在没有声明的情况下不能使用Wsh作为变量,否则会出现错误)

注释2:(COM对象即the Component Object Model,组件对象模型。COM组件是遵行COM规范编写,以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足组建对框架的所有需求简单理解COM对象就是可执行二进制代码存放的根对象(貌似我搞不懂,如果真是这样,他们为什么非要用model模型这个单词呢,为什么不用Root根或family集合这类单词呢)

其中WshNetwork对象主要用于访问局域网环境下的 资源共享,我们这里就不阐述了。
对于WshShell对象,其中的Shell是外壳的意思,应该是此对象能够调用windows的外壳程序,故取名shell,个人觉得那么Wscript.shell这个ProID堪称完美。

因代码中都用另一个对象等价于WshShell,以下用Ws替代WshShell .

功能
Ws能够实现模拟键盘,向激活窗口发送键值实现选择,谈出定时对话框,读写注册表,启动程序,创建快捷方式等等功能。

方法
AppActivate (按键精灵不支持,属vbs)             判断窗口是否被激活
CreateShortcut                                           创建并返回WshShortcut对象
ExpandEnvironmentStrings                            扩展Progress环境变量并返回结果字符串
Popup                                                        显示包含指定消息的消息窗口
RegDelete                                                  删除注册表某目录
RegRead                                                    读取注册表某目录
RegWrite                                                   编辑注册表某目录
Run                                                           启动程序
SendKeys                                                   发送字符串或一些特殊的键盘字符


Ws.AppAcitve  窗口激活经常在自动化测试中需要用到,特别是需要测试对象出现后再做的激活,往往需要一定的等待时间。如果此时使用循环结构进行判断窗口是否激活,可以节省时间。Ws提供了一个非常有用的功能(即方法,不知一个人觉得功能比方法更贴切吧)
语法:   Ws.AppActive(title)
参数title:为需要激活窗口的titile属性值,也就是标题或者ProcessID
返回值:布尔值。如果激活了返回True,未激活返回False


Ws.Popup 在弹窗内显示文本信息,即实现定时提示框的作用。
语法:i=Ws.Popup("text" ,"int","title","nType")
参数:text是弹窗文本内容,int是弹窗最长显示时间秒,title弹窗标题,nType是是弹窗显示按钮和图标类型的数值
返回值:用户单击以解除弹窗的按钮值
例程:YN=Ws.Popup("你去过香格里拉吗“,“20”,“经历”,"2")

Ws.Run  启动windows自带的软件。如记事本  
例程:Ws.Run  "Notepad"

功能:运行记事本

Ws.SendKeys 主要用在对象无法识别时,又要在此对象内输入字符串,即可用此法。又或需要用快捷键时,也可用此法。
语法:Ws.sendkeys  string[,wait]
参数: string为指定要发送的字符串或特殊字符。wait可选,指定等待的方式。

例程:Ws.sendkeys "我去过才怪”

属性
Ws.CurrentDirectory    返回或改变该当前目录
Ws.Environment         返回WshEnvironment对象
Ws.SpecialFolders        
使用WshSpecialFolders对象对windows shell文件夹进行访问。      
<think>嗯,用户想了解如何在VBA中调用WScript.Shell。首先,我得确定用户的使用场景。可能他们需要在Excel或其他Office应用中执行一些系统级的操作,比如运行外部程序、操作文件或者处理环境变量。WScript.Shell确实是一个常用的组件,能提供这些功能。 接下来,我需要整理一下WScript.Shell的常用方法和属性。记得常用的有Run、Exec、SendKeys,还有处理环境变量的ExpandEnvironmentStrings和获取特殊文件夹的SpecialFolders。每个方法的具体参数和用法得说清楚,尤其是Run和Exec的区别,比如是否等待程序结束和返回结果的方式。 用户可能需要示例代码,所以应该准备一些典型的例子。例如用Run启动记事本,或者用Exec执行命令并获取输出。注意提醒他们注意路径中的空格,可能需要用Chr(34)来包裹路径,避免错误。 另外,安全方面的问题也很重要。调用Shell对象可能会有风险,比如执行恶意命令,需要提醒用户谨慎使用,特别是在处理用户输入时。权限问题也要提到,某些操作可能需要管理员权限,而VBA默认可能没有这些权限。 还要考虑用户可能的错误,比如路径问题、权限不足,或者SendKeys的使用限制。比如在SendKeys部分,要说明它依赖于活动窗口,可能需要在代码中加入适当的等待时间。 最后,总结一下WScript.Shell的适用场景,帮助用户判断是否适合他们的需求。可能他们需要更复杂的操作,这时候可以建议结合其他方法或组件。</think>在VBA中调用`WScript.Shell`对象的完整指南如下: # 一、基础概念 `WScript.Shell`是Windows Script Host提供的COM对象,主要用于: 1. 执行系统命令 2. 操作注册表 3. 处理快捷方式 4. 访问环境变量 # 二、VBA调用步骤 ```vba ' 创建对象实例 Dim shell As Object Set shell = CreateObject("WScript.Shell") ``` # 三、核心方法详解 ## 1. Run方法(执行程序) ```vba Dim exitCode As Integer exitCode = shell.Run("notepad.exe", 1, True) ``` 参数说明: - 第1参数:命令/程序路径 - 第2参数:窗口样式 - 0:隐藏窗口 - 1:正常显示 - 2:最小化 - 3:最大化 - 第3参数:等待完成(True/False) ## 2. Exec方法(获取命令输出) ```vba Dim cmd As Object Set cmd = shell.Exec("cmd /c dir") Do While cmd.Status = 0 DoEvents Loop Debug.Print cmd.StdOut.ReadAll ``` ## 3. 特殊应用示例 ### 发送键盘指令 ```vba shell.SendKeys "%{F4}" ' Alt+F4关闭窗口 ``` ### 获取环境变量 ```vba Dim sysPath As String sysPath = shell.ExpandEnvironmentStrings("%SystemRoot%") ``` ### 创建快捷方式 ```vba Dim shortcut As Object Set shortcut = shell.CreateShortcut("C:\test.lnk") shortcut.TargetPath = "C:\Program Files\MyApp\app.exe" shortcut.Save ``` # 四、典型问题解决方案 1. **路径含空格处理** ```vba shell.Run Chr(34) & "C:\Program Files\My App\app.exe" & Chr(34), 1, True ``` 2. **异步执行命令** ```vba shell.Run "calc.exe", 1, False ' 不等待完成 ``` 3. **获取错误信息** ```vba On Error Resume Next shell.Run "invalid.exe", 1, True If Err.Number <> 0 Then MsgBox "错误:" & Err.Description End If ``` # 五、注意事项 1. 安全风险:避免执行不可信命令 2. 权限限制:部分操作需要管理员权限 3. 32/64位兼容:注意系统架构差异 4. 防病毒软件:可能拦截脚本行为 # 六、替代方案建议 对于复杂系统操作,可考虑: - 使用Windows API函数 - 调用PowerShell脚本 - 开发COM组件 建议根据具体需求选择最合适的方法,`WScript.Shell`适合快速实现简单系统操作,但复杂场景需更专业的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值