Пакетный файл для получения определенного установленного программного обеспечения вместе с версией
У меня есть 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 для доступа к хранилищу программного обеспечения.