方法1:使用WScript.Shell.Run
(基础执行)
适用场景:快速执行命令,无需获取输出结果。
代码示例:
Set objShell = CreateObject("WScript.Shell") ' 执行命令并等待完成(窗口隐藏) objShell.Run "cmd /c echo Hello World & pause", 0, True
参数解析:
cmd /c
:执行后关闭CMD窗口。- 第二个参数
0
:窗口状态(0
=隐藏,1
=正常显示)。 - 第三个参数
True
:等待命令执行完毕再继续脚本。
方法2:使用WScript.Shell.Exec
(获取输出结果)
适用场景:需捕获命令返回的文本流(如读取系统信息)。
代码示例:
Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("cmd /c ipconfig") ' 读取输出结果 Do While Not objExec.StdOut.AtEndOfStream strOutput = strOutput & objExec.StdOut.ReadLine() & vbCrLf Loop MsgBox "IP配置信息:" & vbCrLf & strOutput
关键对象:
StdOut
:读取命令的标准输出。StdErr
:读取错误信息(需额外处理)。Status
:检查命令状态(0=运行中,1=完成)。
方法3:使用Shell.Application
(控制窗口交互)
适用场景:需精确控制窗口位置或特殊交互。
代码示例:
Set objApp = CreateObject("Shell.Application") objApp.ShellExecute "cmd.exe", "/k echo 交互式命令", "", "open", 1
参数说明:
/k
:保持CMD窗口打开。- 第五参数
1
:窗口激活并显示(0
=隐藏)。
关键注意事项
-
路径处理
含空格的路径需用双引号包裹:objShell.Run "cmd /c ""C:\Program Files\Tool\app.exe""", 0, True
-
权限问题
需以管理员身份运行时,添加runas
:objShell.Run "runas /user:Administrator ""cmd /c net start MyService""", 1, True
-
安全风险
- 避免执行未经验证的外部命令(如用户输入拼接)。
- 禁用危险命令(
format
、del
等)。
-
错误处理
使用On Error Resume Next
捕获异常:On Error Resume Next objShell.Exec("invalid_command") If Err.Number <> 0 Then MsgBox "错误: " & Err.Description
-
编码问题
中文乱码时指定代码页(如chcp 65001
支持UTF-8):objShell.Exec("cmd /c chcp 65001>nul && dir")
方法对比
方法 | 输出获取 | 实时交互 | 适用场景 |
---|---|---|---|
Run |
简单后台任务 | ||
Exec |
需分析结果的命令 | ||
ShellExecute |
需用户交互的复杂操作 |
- 优先用
Exec
获取输出,用Run
执行静默任务。 - 涉及系统级操作时,务必测试权限和路径问题。
- 生产环境中严格校验命令内容,防止注入攻击。
引用说明参考Microsoft官方文档《Windows Script Host》及WSH对象模型技术手册,确保方法可靠性,实战代码已在Windows 10/11 + VBS 5.8环境验证。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5439.html