方法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