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

如何在VB6中获取Shell命令返回结果并存入变量以读取exe版本号

问题根因

你的代码无法得到预期结果有两个核心原因:

  1. VB6内置的Shell函数返回值是启动进程的ID(整型数值),不是命令行的执行输出内容,所以直接拆分返回值完全得不到版本信息。
  2. 命令拼接逻辑错误:变量boPath被包裹在字符串引号内部,不会被解析为实际路径值,就算能拿到输出也会因为路径错误查询失败。

可用实现方案

方案1:捕获wmic命令执行输出

如果需要依赖wmic实现需求,可以通过WScript.Shell对象的Exec方法执行命令,读取标准输出流拿到结果:

Dim wsh As Object, execObj As Object
Dim cmdStr As String, BoVersion As String
Dim boPath As String
' 替换为实际exe路径,注意wmic要求路径中的反斜杠必须转义为双反斜杠
boPath = "C:\\Windows\\notepad.exe"

Set wsh = CreateObject("WScript.Shell")
' 拼接命令,加/value参数可以过滤掉表头、空行等冗余输出
cmdStr = "wmic datafile where name=""" & boPath & """ get version /value"
Set execObj = wsh.Exec(cmdStr)
' 读取命令全部输出内容
BoVersion = execObj.StdOut.ReadAll
' 处理输出,去掉前缀和多余空白
BoVersion = Trim(Replace(BoVersion, "Version=", ""))

' 后续你的拆分逻辑可正常运行
Dim BoVersionArr() As String
BoVersionArr = Split(BoVersion, ".")
boVerYear = CStr(BoVersionArr(0))
boVerMonth = CStr(BoVersionArr(1))
boVerDay = CStr(BoVersionArr(2))
boVerMin = CStr(BoVersionArr(3))

方案2:原生API获取文件版本(更稳定)

无需依赖wmic和命令行,直接调用Windows系统的版本查询API实现,性能和兼容性更好:
首先在VB6标准模块顶部声明API:

Private Declare Function GetFileVersionInfoSize Lib "version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
Private Declare Function GetFileVersionInfo Lib "version.dll" Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal dwHandle As Long, ByVal dwLen As Long, lpData As Any) As Long
Private Declare Function VerQueryValue Lib "version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lpBuffer As Any, lpuLen As Long) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

在同模块封装调用函数:

Public Function GetExeFileVersion(ByVal filePath As String) As String
    Dim verSize As Long, verBuffer() As Byte
    Dim langCode As String, pBuffer As Long
    Dim verTemp As String
    
    ' 读取版本信息大小
    verSize = GetFileVersionInfoSize(filePath, 0)
    If verSize = 0 Then Exit Function
    ReDim verBuffer(verSize - 1)
    ' 读取版本信息到缓冲区
    Call GetFileVersionInfo(filePath, 0, verSize, verBuffer(0))
    ' 获取语言编码
    Call VerQueryValue(verBuffer(0), "\VarFileInfo\Translation", pBuffer, 4)
    If pBuffer = 0 Then Exit Function
    langCode = Right("0000" & Hex(CopyMemoryInteger(pBuffer)), 4) & Right("0000" & Hex(CopyMemoryInteger(pBuffer + 2)), 4)
    ' 查询文件版本
    Call VerQueryValue(verBuffer(0), "\StringFileInfo\" & langCode & "\FileVersion", pBuffer, 4)
    If pBuffer = 0 Then Exit Function
    verTemp = String(256, 0)
    Call lstrcpy(verTemp, pBuffer)
    GetExeFileVersion = Left(verTemp, InStr(verTemp, Chr(0)) - 1)
End Function

Private Function CopyMemoryInteger(ByVal ptr As Long) As Integer
    Call CopyMemory(CopyMemoryInteger, ByVal ptr, 2)
End Function

直接调用即可拿到版本号:

Dim BoVersion As String
BoVersion = GetExeFileVersion("C:\Windows\notepad.exe")
' 后续直接执行你的拆分逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:15:00