You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将PowerShell脚本转为VBScript获取无线网卡信息遇问题求助

我来帮你一步步解决这个VBScript转换的问题,核心问题出在串口操作的方式和正则匹配的细节上:

问题根源分析

你的VBScript尝试用Scripting.FileSystemObject来读写串口,这是完全错误的用法——FSO是专门用于文件系统操作的,根本不支持串口通信。这就是为什么你会遇到The requested resource is in use错误,因为FSO无法正确管理串口的资源释放,同时这种访问方式本身就不符合串口通信的规范。另外正则匹配的逻辑也和PowerShell原脚本有偏差。

解决方案步骤

1. 改用.NET的SerialPort类实现串口通信

和PowerShell一样,VBScript可以直接调用.NET的System.IO.Ports.SerialPort类来实现串口操作,这才是正确的方式。你之前尝试过但没成功,是因为VBScript调用.NET对象的语法和PowerShell略有不同。

2. 修正正则匹配逻辑

原PowerShell脚本中$tVar -Match $sRegExp会匹配第一个符合条件的结果并放入$Matches[0],但你的VBScript循环所有匹配项后只保留最后一个,这和原逻辑不符。我们需要调整正则的Global属性,只取第一个匹配结果。

3. 修正后的完整VBScript脚本

' 定义串口参数(根据你的实际设备调整)
strComPortNumber = "COM3" ' 替换为你的Modem串口
strComPortSpeed = 9600 ' 替换为匹配的波特率

Function fQueryModem(strQuery, strRegExp)
    Dim oComPort, tVar, oRE, oMatches
    
    ' 初始化SerialPort对象
    Set oComPort = CreateObject("System.IO.Ports.SerialPort")
    oComPort.PortName = strComPortNumber
    oComPort.BaudRate = strComPortSpeed
    oComPort.Parity = 0 ' None对应枚举值0
    oComPort.DataBits = 8
    oComPort.StopBits = 1 ' One对应枚举值1
    
    On Error Resume Next ' 捕获串口操作错误
    oComPort.Open()
    If Err.Number <> 0 Then
        fQueryModem = "串口打开失败:" & Err.Description
        Err.Clear
        Exit Function
    End If
    On Error GoTo 0
    
    ' 发送AT命令
    oComPort.Write("AT")
    oComPort.Write(strQuery & vbCr) ' 用vbCr替代`r,VBScript的回车符
    
    ' 等待设备响应
    WScript.Sleep(50)
    
    ' 读取响应内容
    tVar = oComPort.ReadExisting()
    oComPort.Close() ' 确保关闭串口释放资源
    
    ' 清理响应内容
    tVar = Trim(Replace(tVar, "OK", ""))
    
    ' 正则匹配处理
    If strRegExp <> "" Then
        Set oRE = New RegExp
        oRE.IgnoreCase = True
        oRE.Global = False ' 只匹配第一个结果,和PowerShell逻辑对齐
        oRE.Pattern = strRegExp
        
        Set oMatches = oRE.Execute(tVar)
        If oMatches.Count > 0 Then
            fQueryModem = oMatches(0).Value ' 取第一个匹配项
        Else
            fQueryModem = "未找到匹配内容"
        End If
    Else
        fQueryModem = tVar
    End If
End Function

' 调用函数获取信息
strMEID = fQueryModem("+CGSN","\d{15}")
strModemModel = fQueryModem("+CGMM","")
strPhoneNumber = fQueryModem("+CNUM","\d{11}")
strSIM = fQueryModem("+ICCID","\d{20}")
strFirmwareDate = fQueryModem("+GMR","\d{4}/\d{2}/\d{2}")

' 输出结果用于测试
WScript.Echo "MEID: " & strMEID
WScript.Echo "Modem型号: " & strModemModel
WScript.Echo "手机号: " & strPhoneNumber
WScript.Echo "SIM卡ICCID: " & strSIM
WScript.Echo "固件日期: " & strFirmwareDate

额外注意事项

  • 请确保strComPortNumber和strComPortSpeed与你的Modem实际参数匹配,波特率、奇偶校验等参数错误会导致无法通信。
  • 运行脚本时可能需要管理员权限,避免串口访问被权限限制。
  • 测试前确认没有其他程序占用该串口(比如串口调试工具),否则会出现资源占用错误。

内容的提问来源于stack exchange,提问作者lmoraguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:51:42