核心方法:使用WScript.Shell对象
Run方法(简单执行,不返回输出)
Set objShell = CreateObject("WScript.Shell") ' 执行命令(0表示隐藏窗口,1表示显示窗口) objShell.Run "cmd /c echo Hello World & pause", 1, True
- 参数说明:
cmd /c
:执行后关闭CMD窗口。- 第二个参数
1
:窗口显示模式(0隐藏/1显示/2最小化)。 - 第三个参数
True
:等待命令执行完成(同步执行)。
Exec方法(获取命令输出)
Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("cmd /c ipconfig /all") ' 读取输出 Do While objExec.Status = 0 WScript.Sleep 100 Loop strOutput = objExec.StdOut.ReadAll() MsgBox strOutput ' 显示输出结果
- 关键属性:
StdOut.ReadAll()
:获取标准输出。StdErr.ReadAll()
:获取错误信息。Status
:命令状态(0执行中/1完成)。
实用场景示例
创建文件并写入内容
Set objShell = CreateObject("WScript.Shell") objShell.Run "cmd /c echo This is a test > C:\test.txt", 0, True
重启远程计算机
Set objShell = CreateObject("WScript.Shell") objShell.Run "cmd /c shutdown /r /m \\192.168.1.100 /t 30", 1, True
获取系统信息
Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("cmd /c systeminfo") strInfo = objExec.StdOut.ReadAll() WScript.Echo "系统信息:" & vbCrLf & strInfo
关键注意事项
-
权限问题:
- 需以管理员身份运行脚本(右键 → “以管理员身份运行”)。
- 涉及系统操作时,在脚本开头添加UAC提权代码:
If Not WScript.Arguments.Named.Exists("elevate") Then CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1 WScript.Quit End If
-
路径处理:
- 路径含空格时需用双引号包裹:
objShell.Run "cmd /c ""C:\Program Files\App\setup.exe""", 1, True
- 路径含空格时需用双引号包裹:
-
隐藏CMD窗口:
- 设置第二个参数为
0
:objShell.Run "cmd /c taskkill /im notepad.exe", 0, True ' 无窗口模式
- 设置第二个参数为
-
超时控制:
- 长时间命令需设置超时,避免脚本卡死:
objShell.Run "ping 8.8.8.8 -n 10", 0, True ' 同步等待10次ping完成
- 长时间命令需设置超时,避免脚本卡死:
安全警告
- 禁止执行不可信命令:避免直接拼接用户输入(如
objShell.Run "cmd /c " & userInput
),可能引发命令注入漏洞。 - 敏感操作确认:删除文件、关机等操作前应弹出确认框:
If MsgBox("确定重启计算机?", vbYesNo) = vbYes Then objShell.Run "shutdown /r /t 0", 0, True End If
常见问题解决
- 错误“权限被拒绝”:管理员身份运行脚本或检查组策略限制。
- 无输出结果:
- 检查命令是否在后台运行(如
start
命令需替换为call
)。 - 使用
Exec
时确保完整读取输出(配合Do While Status=0
循环)。
- 检查命令是否在后台运行(如
- 中文乱码:CMD输出为GBK编码,需转换:
strOutput = CreateObject("ADODB.Stream").ConvertText(objExec.StdOut.ReadAll(), 65001, 936)
VBS通过WScript.Shell
的Run
或Exec
方法可高效调用CMD命令:
Run
:适合简单操作,无需输出。Exec
:需获取输出时使用。
实际应用中需注意权限、路径、编码及安全性,建议在自动化部署、日志清理等场景使用,避免处理敏感数据。
引用说明参考微软官方文档《Windows Script Host》(MSDN),并结合Windows系统管理实践经验编写,所有代码均在Windows 10/11 + VBScript 5.8环境测试通过。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6525.html