【问题标题】:Detect .Net Framework 3.5 or higher using VBS through WMI通过 WMI 使用 VBS 检测 .Net Framework 3.5 或更高版本
【发布时间】:2015-03-19 14:36:48
【问题描述】:

我创建了一个脚本,它检测通过注册表安装的已安装 .Net Framework。该条件应专门检测 3.5 或更高版本并继续该过程。但是,使用注册表似乎是不可能的。每次安装新版本时,您都必须搜索并输入注册表或修改脚本才能使其正常工作。

然后我在谷歌上搜索它可以通过 WMI 完成,这似乎可行。我已将脚本修改为灵活,即使新安装了高于 3.5 的 .net 框架,它也会自动检测安装的 3.5 或更高版本。不幸的是,如果脚本检测到有较低版本或未安装 .net 框架,则一种情况不起作用,脚本应该退出并且不会继续该过程。

WriteLog "Checking if there is .Net Framework 4.5, .Net Framework 4.0 and .Net Framework 3.5 installed on the machine.."
If ((RegValueExists("HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL\{8E34682C-8118-31F1-BC4C-98CD9675E1C2}\")) AND (RegValueExists("HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL\{F5B09CFD-F0B2-36AF-8DF4-1DF6B63FC7B4}\"))) Then

    WriteLog"Framework 4 detected on system. "
    WriteLog "Proceeding with installation..."

ElseIf FrameworkCheck("3.5") Then

    'Proceed with installation

End If

功能框架检查

Function FrameworkCheck(strVersion)

Dim strComputer, objWMIService, colItems, strVar, objItem

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select Name, Version from Win32_Product Where Name Like 'Microsoft .NET Framework%'")

For Each objItem in colItems

    If objItem.Version => strVersion Then

        WriteLog "Detected Framework Version: " & objItem.Version & " - " & objItem.Name
        WriteLog "Proceeding with installation..."

    ElseIf objItem.Version <> 0 Then

        WriteLog "NOK-Framework 3.5 or later not detected on system. Installation not possible. Please check basic client installation"
        WScript.Quit(-1)            

    End If

Next

End Function

【问题讨论】:

    标签: .net vbscript detection wmi-query


    【解决方案1】:

    您可能希望有一个函数来获取最大框架版本,然后更改调用代码以查看它是否返回 >= 所需的最低版本(我尚未检查此语法):

    Function MaxFrameworkVersionCheck()
    
    Dim strComputer, objWMIService, colItems, strVar, objItem, maxVersion
    
    maxVersion = 0
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select Name, Version from Win32_Product Where Name Like 'Microsoft .NET Framework%'")
    
    For Each objItem in colItems
        WriteLog "Detected Framework Version: " & objItem.Version & " - " & objItem.Name
        If objItem.Version > maxVersion Then
    
            maxVersion = objItem.Version
    
        End If
    
    Next
    
    MaxFrameworkVersionCheck = maxVersion
    
    End Function
    

    【讨论】:

    • 会试试这个,你能解释一下为什么你把它设置为“0”。我尝试在没有安装框架的情况下运行脚本,但它什么也没返回。
    • 我曾经编写过很多 C 代码,所以我只是习惯于总是初始化我的变量。我没有检查所有语法或尝试运行代码,但从概念上讲,这应该可以实现您想要的。如果没有安装框架,我希望函数返回 0。
    【解决方案2】:

    您还可以使用 Environment.Version 来检查运行时版本,而不是注册表。请参阅此文档了解更多详细信息:https://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#clr_b

    【讨论】:

    • 这只会给你当前运行的框架版本,不一定是系统上安装的最大框架版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多