Skip to content

调试技巧

🍋 弹框大法

将中间值或者需要查看的数据直接使用 msgbox 进行弹框显示

语法

vb
MsgBox(prompt[, buttons][, title][, helpfile, context])

参数说明:

  • prompt:显示在对话框中的消息文本(必需)
  • buttons:指定按钮组合和图标的数值表达式(可选)
  • title:对话框标题栏中的文本(可选)
  • helpfile:帮助文件的路径(极少使用)
  • context:帮助主题的上下文 ID(极少使用)

返回值说明:

常量描述
vbOK1确定按钮被点击
vbCancel2取消按钮被点击
vbAbort3终止按钮被点击
vbRetry4重试按钮被点击
vbIgnore5忽略按钮被点击
vbYes6是按钮被点击
vbNo7否按钮被点击

按钮说明:

常量描述
vbOKOnly0只显示确定按钮(默认)
vbOKCancel1显示确定和取消按钮
vbAbortRetryIgnore2显示终止、重试和忽略按钮
vbYesNoCancel3显示是、否和取消按钮
vbYesNo4显示是和否按钮
vbRetryCancel5显示重试和取消按钮
vbCritical16显示关键消息图标(红色 X)
vbQuestion32显示警告询问图标(问号)
vbExclamation48显示警告消息图标(感叹号)
vbInformation64显示信息消息图标(i 图标)
vbDefaultButton10第一个按钮是默认的(默认)
vbDefaultButton2256第二个按钮是默认的
vbDefaultButton3512第三个按钮是默认的
vbDefaultButton4768第四个按钮是默认的
vbApplicationModal0应用程序模式(默认)
vbSystemModal4096系统模式(所有应用程序挂起)

示例

  • 基本消息框
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,否则输出乱码或者造成其他未知异常

picture 0

🍋 日志追踪法

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

输出如下

picture 2

🍋 错误处理

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

执行结果如下

picture 1