Batch file 批处理文件以获取特定安装的软件及其版本

Batch file 批处理文件以获取特定安装的软件及其版本,batch-file,Batch File,我有一个脚本,可以找到特定安装的软件,但我在获取软件版本时也遇到了问题。例如,假设我正在获取所有已安装Microsoft软件的列表。以下是我迄今为止所做的: echo software installed > software_list.txt echo ================= >>software_list.txt reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uni

我有一个脚本,可以找到特定安装的软件,但我在获取软件版本时也遇到了问题。例如,假设我正在获取所有已安装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?如果我用DisplayVersion替换DisplayName,甚至什么也找不到。或者,这里还有别的路可以走吗

[无耻地复制/粘贴@Helen的答案从这里开始]

如果您感兴趣的软件是由Windows Installer安装的,您可以通过查询WMI Win32_产品类获取有关该软件的信息(例如名称、供应商、版本等)。在批处理文件中,这可以使用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输出保存到文件,可以使用/output和/或/format参数,例如:

wmic /output:software.txt product get Name, Version
wmic /output:software.htm product get Name, Version /format:htable
wmic/output:software.txt产品名称、版本 wmic/output:software.htm产品名称、版本/格式:htable

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

[结束无耻地复制/粘贴@Helen ends的答案。]

如果该软件不是由Windows Installer安装的,而不是在注册表中查找,那么您可以查找EXE本身。您需要的不仅仅是.bat文件。你需要的东西,可以打开前男友和提取版本信息


我想看一下,这是windows对.bat文件的继承。使用System.Diagnostics.FileVersionInfo.GetVersionInfo获取版本。

PowerShell之外的另一种可能性(这是一种很好的方法)是将WMI与JScript或VBScript一起使用以访问软件存储。

显示名称
替换为
显示版本
会导致空输出,因为这行的工作方式:

find "Microsoft" temp1.txt| find "DisplayName" > temp2.txt
此行的作用是查找
temp2.txt
文件中同时包含Microsoft和DisplayName子字符串的所有行(即,它查找名称中包含Microsoft的产品)。DisplayVersion的行依次包含产品版本号,但不包含单词Microsoft,这就是为什么会得到空输出。

我可以建议使用以下几种替代解决方案:

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

    用法:

    cscript //nologo productlist.vbs cscript //nologo productlist.vbs > productlist.txt
  • 列出所有已安装的Microsoft产品:

    wmic product where "Vendor like '%Microsoft%'" get Name, Version
    
  • 列出名称中包含Office的已安装产品:

    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/?


    适用于一系列计算机“阵列”的类似脚本


    有没有办法获取Windows Installer安装的程序的安装路径?我的程序是一个互操作Excel加载项,只包含.dll,不包含可执行文件.exe。可以看到我的添加/删除程序和wmic产品获取名称、版本列表,但不是通过命令where@Kenny:请尝试
    InstallLocation
    属性,例如
    wmic get Name,InstallLocation
    。不幸的是,InstallLocation为空。我的印象是,wmic从HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall获取信息是由于类似的属性列表。您还可以从这个注册表项中看到,许多应用程序缺少“InstallLocation”。@Kenny,我建议。x86应用程序未列出或可能仅用于“Google Chrome”
    wmic /output:software.txt product get Name, Version
    wmic /output:software.htm product get Name, Version /format:htable
    
    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