Пакетный файл для получения определенного установленного программного обеспечения вместе с версией

У меня есть script, который находит определенное установленное программное обеспечение, но у меня возникают проблемы с получением версии программного обеспечения. Например, скажем, я получаю список всех установленных программ 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

Как я могу получить DisplayVersion из reg reg? Если я заменю DisplayName на DisplayVersion, ничего не найдено. Или, есть ли другой путь, который я должен здесь взять?

Ответ 1

Замена DisplayName на DisplayVersion приводит к пустым выводам из-за способа работы этой строки:

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

Что делает эта строка, так это поиск всех строк в файле temp2.txt, который содержит подстроки Microsoft и DisplayName (то есть находит продукты, чьи имена содержат Microsoft). Строки с DisplayVersion, в свою очередь, содержат номера версий продуктов и не содержат слова Microsoft, поэтому вы получаете пустой вывод.

Я могу предложить пару альтернативных решений, которые используют WMI:

  • Разбирайте подразделы HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, используя script (VBScript, PowerShell и т.д.), а не командный файл, потому что языки сценариев предлагают гораздо лучшую поддержку текстовых манипуляций. Здесь приведен пример VBScript, который выводит имена и версии установленных продуктов Microsoft (продукты, чьи имена содержат Microsoft, если быть более точным):

    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 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 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
  • Если интересующее вас программное обеспечение установлено установщик Windows, вы можете получить информацию об этом программном обеспечении (например, имя, поставщик, версия и т.д.) путем запроса класса WMI Win32_Product. Утилита wmic позволяет вам делать это непосредственно из командной строки и пакетных файлов. Вот несколько примеров:

    • Распечатайте имена и версии установленного программного обеспечения:

      wmic product get Name, Version
      
    • Список всех установленных продуктов 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 /?

Ответ 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 в файл, вы можете использовать параметры /output и/или/format, например:

wmic/output:software.txt получить имя, версия wmic/output:software.htm product get Имя, версия/формат: htable

Дополнительные сведения о синтаксисе wmic см. в разделе wmic/?

[Конец бесстыдного копирования/вставки ответа от @Helen заканчивается здесь.]

Если программное обеспечение не было установлено установщиком Windows, а не выглядело в реестре, вы могли бы посмотреть сами exes. Вам нужно что-то помимо простого .bat файла. Вам нужно что-то, что может открыть exes и извлечь информацию о версии.

Я бы посмотрел на PowerShell, который является преемником Windows.bat файлов. Используйте System.Diagnostics.FileVersionInfo.GetVersionInfo, чтобы получить версию.

Ответ 3

аналогичный script работает для ряда компьютеров "Массив"

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

Ответ 4

Еще одна возможность, помимо PowerShell (которая является хорошей), - использовать WMI с JScript или VBScript для доступа к хранилищу программного обеспечения.