调试技巧
🍋 弹框大法
将中间值或者需要查看的数据直接使用 msgbox 进行弹框显示
语法
vb
MsgBox(prompt[, buttons][, title][, helpfile, context])
参数说明:
- prompt:显示在对话框中的消息文本(必需)
- buttons:指定按钮组合和图标的数值表达式(可选)
- title:对话框标题栏中的文本(可选)
- helpfile:帮助文件的路径(极少使用)
- context:帮助主题的上下文 ID(极少使用)
返回值说明:
常量 | 值 | 描述 |
---|---|---|
vbOK | 1 | 确定按钮被点击 |
vbCancel | 2 | 取消按钮被点击 |
vbAbort | 3 | 终止按钮被点击 |
vbRetry | 4 | 重试按钮被点击 |
vbIgnore | 5 | 忽略按钮被点击 |
vbYes | 6 | 是按钮被点击 |
vbNo | 7 | 否按钮被点击 |
按钮说明:
常量 | 值 | 描述 |
---|---|---|
vbOKOnly | 0 | 只显示确定按钮(默认) |
vbOKCancel | 1 | 显示确定和取消按钮 |
vbAbortRetryIgnore | 2 | 显示终止、重试和忽略按钮 |
vbYesNoCancel | 3 | 显示是、否和取消按钮 |
vbYesNo | 4 | 显示是和否按钮 |
vbRetryCancel | 5 | 显示重试和取消按钮 |
vbCritical | 16 | 显示关键消息图标(红色 X) |
vbQuestion | 32 | 显示警告询问图标(问号) |
vbExclamation | 48 | 显示警告消息图标(感叹号) |
vbInformation | 64 | 显示信息消息图标(i 图标) |
vbDefaultButton1 | 0 | 第一个按钮是默认的(默认) |
vbDefaultButton2 | 256 | 第二个按钮是默认的 |
vbDefaultButton3 | 512 | 第三个按钮是默认的 |
vbDefaultButton4 | 768 | 第四个按钮是默认的 |
vbApplicationModal | 0 | 应用程序模式(默认) |
vbSystemModal | 4096 | 系统模式(所有应用程序挂起) |
示例
- 基本消息框
vb
MsgBox "这是一个简单的消息框"
- 带标题的消息框
vb
MsgBox "操作已完成", , "系统提示"
- 带返回值检查的消息框
vb
result = MsgBox("您确定要删除此文件吗?", vbYesNo + vbQuestion, "确认删除")
If result = vbYes Then
WScript.Echo "用户选择了是"
Else
WScript.Echo "用户选择了否"
End If
- 带图标和多个按钮
vb
response = MsgBox("文件保存失败,是否重试?", vbAbortRetryIgnore + vbExclamation, "错误")
Select Case response
Case vbAbort
WScript.Echo "用户选择了终止"
Case vbRetry
WScript.Echo "用户选择了重试"
Case vbIgnore
WScript.Echo "用户选择了忽略"
End Select
- 设置默认按钮
vb
' 第二个按钮(否)为默认
response = MsgBox("是否继续操作?", vbYesNo + vbQuestion + vbDefaultButton2, "确认")
- 多行消息文本
vb
MsgBox "第一行" & vbCrLf & "第二行" & vbCrLf & "第三行", , "多行消息"
- 格式化文本
vb
Dim message
message = "错误详情:" & vbCrLf & vbCrLf
message = message & "错误代码:1001" & vbCrLf
message = message & "错误描述:文件访问被拒绝" & vbCrLf
MsgBox message, vbCritical, "系统错误"
- 超长文本自动换行
vb
longText = "这是一个非常长的消息文本,它将自动换行以适应消息框的宽度。" & _
"VBScript的MsgBox会自动处理长文本的换行显示问题。" & _
"无需手动添加换行符,除非需要特定的换行位置。"
MsgBox longText, vbInformation, "长文本示例"
- 确认对话框
vb
Function ConfirmAction(message)
ConfirmAction = (MsgBox(message, vbYesNo + vbQuestion, "请确认") = vbYes)
End Function
' 使用示例
If ConfirmAction("确定要删除此用户吗?") Then
' 执行删除操作
End If
🍋 Shell 大法
借用自己熟悉的脚本比如 python 等,处理中间数据并输出,然后在 vbs 中通过 shell 执行命令
- 运行程序
vb
Set objShell = CreateObject("WScript.Shell")
' 执行命令并等待完成
returnCode = objShell.Run("cmd /c dir C:\", 1, True)
msgbox "命令返回码: " & returnCode
' 不等待命令完成
objShell.Run "notepad.exe", 1, False
- 操作文件和目录
vb
Set objShell = CreateObject("WScript.Shell")
' 复制文件
objShell.Run "cmd /c copy C:\file1.txt C:\backup\", 0, True
' 创建目录
objShell.Run "cmd /c mkdir C:\NewFolder", 0, True
- 网络相关命令
vb
Set objShell = CreateObject("WScript.Shell")
' Ping测试
result = ExecuteCommand("ping 8.8.8.8 -n 2")
WScript.Echo result
' 网络诊断
objShell.Run "cmd /c ipconfig /all", 1, True
- 设置环境变量
vb
Set objShell = CreateObject("WScript.Shell")
' 设置用户环境变量
'objShell.Environment("User")("MY_VAR") = "SomeValue"
' 获取系统环境变量
pathVar = objShell.Environment("System")("PATH")
msgbox "系统PATH: " & pathVar
- 特殊文件夹路径
vb
Set objShell = CreateObject("WScript.Shell")
' 获取特殊文件夹路径
desktopPath = objShell.SpecialFolders("Desktop")
WScript.Echo "桌面路径: " & desktopPath
' 其他可用文件夹:
' AllUsersDesktop, AllUsersStartMenu, Programs, Startup, etc.
- 命令执行错误处理
vb
On Error Resume Next
returnCode = objShell.Run("invalid_command", 0, True)
If Err.Number <> 0 Then
WScript.Echo "命令执行错误: " & Err.Description
Err.Clear
Else
WScript.Echo "命令返回码: " & returnCode
End If
On Error GoTo 0
🍋 延迟处理
- ping
原理:利用 ping 命令的 -n 参数指定发送请求次数,-w 参数指定超时时间(毫秒)
vb
Sub DelayByPing(seconds)
Set objShell = CreateObject("WScript.Shell")
' ping 127.0.0.1 -n (seconds+1) -w 1000
objShell.Run "cmd /c ping 127.0.0.1 -n " & (seconds + 1) & " -w 1000 > nul", 0, True
End Sub
' 使用示例
msgbox "start"
DelayByPing 5 ' 延迟5秒
msgbox "here"
- timeout
vb
Sub DelayByTimeout(seconds)
Set objShell = CreateObject("WScript.Shell")
objShell.Run "timeout /t " & seconds & " /nobreak", 0, True
End Sub
' 使用示例
msgbox "start"
DelayByTimeout 5 ' 延迟5秒
msgbox "here"
- DateAdd 和 DateDiff
vb
Sub DelayByDate(seconds)
endTime = DateAdd("s", seconds, Now())
Do Until Now() >= endTime
' 空循环等待
Loop
End Sub
' 使用示例
msgbox "start"
DelayByDate 5 ' 延迟5秒
msgbox "here"
🍋 中文处理
如果脚本中含有中文,则需将脚本修改为 ANSI,否则输出乱码或者造成其他未知异常
🍋 日志追踪法
vb
dim LogsRoot
LogsRoot = "E:\Logs\"
dim i
for i=0 to 5
call WriteLogDated(i)
next
Sub WriteLogDated(message)
Dim logFile
logFile = GetLogFileName()
WriteLogToFile logFile, message
End Sub
Function GetLogFileName()
Dim logPath, logName
logName = "app_" & Year(Now) & Right("0" & Month(Now), 2) & Right("0" & Day(Now), 2) & ".log"
GetLogFileName = LogsRoot & logName
End Function
Sub WriteLogToFile(filePath, message)
Dim fso, file
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(filePath) Then
Set file = fso.OpenTextFile(filePath, 8) ' 追加
Else
If Not fso.FolderExists(fso.GetParentFolderName(filePath)) Then
fso.CreateFolder(fso.GetParentFolderName(filePath))
End If
Set file = fso.CreateTextFile(filePath)
End If
file.WriteLine Now & " - " & message
file.Close
End Sub
输出如下
🍋 错误处理
vb
On Error Resume Next
' 可能出错的代码
a = 1/0
msgbox a
If Err.Number <> 0 Then
MsgBox "错误 #" & Err.Number & vbCrLf & Err.Description, vbCritical, "操作失败"
Err.Clear
End If
On Error GoTo 0
执行结果如下