2009-09-27 63 views
2

我有一个脚本可以找到特定的已安装软件,但我也无法获取软件的版本。例如,假设我收到了所有安装的Microsoft软件的列表。这是我到目前为止:批处理文件以获取特定的已安装软件以及版本

echo software installed > software_list.txt 
echo ================= >>software_list.txt 
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall temp1.txt 
find "Microsoft" temp1.txt| find "DisplayName" > temp2.txt 
for /f "tokens=2,3 delims==" %%a in (temp2.txt) do (echo %%a >> software_list.txt) 

start notepad "software_list.txt" 

del temp1.txt temp2.txt 

我怎样才能从reg出口获得DisplayVersion?如果我将DisplayName替换为DisplayVersion,则甚至找不到任何内容。或者,我还有另外一个途径吗?

回答

12

的,因为这条线的工作方式在一个空的输出更换DisplayNameDisplayVersion结果:

find "Microsoft" temp1.txt| find "DisplayName" > temp2.txt 

什么这行做的是找到在temp2.txt文件中同时包含微软所有行DisplayName子字符串(也就是说,它查找名称包含Microsoft)的产品。 DisplayVersion这些行依次包含产品版本号,并且不包含单词Microsoft,这就是为什么您会得到空输出。

我可以建议一对夫妇使用WMI替代解决方案:

  1. 使用脚本(VBScript中,PowerShell的等),而不是一个批处理文件解析HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall子项,因为脚本语言提供更好的支持文本操作。下面是输出安装的Microsoft产品的名称和版本VBScript示例(产品名称中包含微软,更精确地说):

    On Error Resume Next 
    
    Const strComputer = "." 
    Const HKLM  = &H80000002 
    Const strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
    
    Dim oReg, arrSubKeys, strProduct, strDisplayName, strVersion 
    
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
        strComputer & "\root\default:StdRegProv") 
    
    ' Enumerate the subkeys of the Uninstall key 
    oReg.EnumKey HKLM, strKeyPath, arrSubKeys 
    For Each strProduct In arrSubKeys 
        ' Get the product's display name 
        oReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayName", strDisplayName 
        ' Process only products whose name contain 'Microsoft' 
        If InStr(1, strDisplayName, "Microsoft", vbTextCompare) > 0 Then 
        ' Get the product's display version 
        oReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayVersion", strVersion 
        WScript.Echo strDisplayName & vbTab & strVersion 
        End If 
    Next 
    

    用法:

    cscript //nologo productlist.vbs 
    cscript //nologo productlist.vbs > productlist.txt
  2. 如果你的软件'感兴趣的是由Windows Installer安装的,您可以通过查询WMI Win32_Product类获得有关该软件的信息(如名称,供应商,版本等)。 wmic实用程序可让您直接从命令行和批处理文件执行此操作。我这里还有一些例子:

    • 打印的姓名和所安装的软件版本:

      wmic product get Name, Version 
      
    • 列出所有安装的Microsoft产品:

      wmic product where "Vendor like '%Microsoft%'" get Name, Version 
      
    • 列出已安装的产品,有办公室名称:

      wmic product where "Name like '%Office%'" get Name, Version 
      

    要将wmic输出保存到一个文件,你可以使用/output和(可选)/format参数,例如:

    wmic /output:software.txt product get Name, Version 
    wmic /output:software.htm product get Name, Version /format:htable 
    

    有关wmic语法的详细信息,请参阅wmic /?

+0

有没有办法让Window Installer安装的程序的安装路径?我的程序是一个Interop Excel插件,只包含.dlls并且没有可执行文件.exe。看到我的添加/删除程序和_wmic产品获取名称,版本_列表,但不是通过命令_where_ – Kenny

+0

@Kenny:尝试'InstallLocation'属性,例如'wmic获取名称,InstallLocation'。 – Helen

+0

不幸的是InstallLocation是空的。由于类似的属性列表,我感觉_wmic_从_HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall_获取信息。你也可以从这个注册表项看到许多有_InstallLocation_missing。 – Kenny

2

[可耻的复制/粘贴@海伦的回答从这里开始]

如果你感兴趣的是Windows安装程序安装的软件,就可以得到这些软件的信息(如姓名,供应商,版本等)通过查询WMI Win32_Product类。在批处理文件中,可以使用WMI命令行实用程序wmic完成此操作。我这里还有一些例子:

* 

    Print the names and versions of installed software: 

    wmic product get Name, Version 

* 

    List all installed Microsoft products: 

    wmic product where "Vendor like '%Microsoft%'" get Name, Version 

* 

    List installed products that have Office in their names: 

    wmic product where "Name like '%Office%'" get Name, Version 

要在WMIC输出保存到一个文件,你可以使用/输出和/或/格式参数,例如:

WMIC /output:software.txt产品获得名称,版本 wmic /output:software.htm产品名称,版本/格式:htable

有关wmic语法的更多信息,请参见wmic /?

[从@Helen恬不知耻地复制/粘贴答案的结束在这里结束。]

如果Windows安装程序安装的软件wasnt”,而不是在注册表中查找,你可以看看在自己的前男友。你需要的东西超出一个纯粹的.bat文件。你需要一些可以打开exes并提取版本信息的东西。

我会看看PowerShell,它是.bat文件的Windows后继。使用System.Diagnostics.FileVersionInfo.GetVersionInfo获取版本。

0

超越PowerShell的另一种可能性(这是一个很好的做法)是使用带有JScript或VBScript的WMI来访问软件存储。

1

类似的脚本,适用于多种计算机“阵列”

On Error Resume Next 

    Const wbemFlagReturnImmediately = &h10 
    Const wbemFlagForwardOnly = &h20 
    'What Programm to look for 
    Const strProgram = "Microsoft" 

    arrComputers = Array("NAME1","Name2") 
    For Each strComputer In arrComputers 
     WScript.Echo 
     WScript.Echo "==========================================" 
     WScript.Echo "Computer: " & strComputer 
     WScript.Echo "==========================================" 

     Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
     Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Product WHERE Name like '%" & strProgram & "%'") 

     For Each objItem In colItems 
      WScript.Echo "Name: " & objItem.Name & ";" & "Version: " & objItem.Version 
    Next 
Next 
相关问题