Эта статья рассказывает, как в командной строке Windows получить список программ, установленных на компьютере, локальном или удалённом.
Статья предназначена для системных администраторов, которые хотели бы автоматизировать контроль установленных программ на компьютерах своей сети. Например, можно проверить, установлено ли важное обновление Windows или все ли рабочие станции имеют правильную версию Office. Далее показаны примеры кода, а в конце статьи находятся ссылки на скачивание файлов.
Как получить информацию об установленных программах
Данные об установленных на компьютере программах хранятся в реестре Windows, причем в нескольких местах. Программы, установленные «для всех пользователей», перечисляются в ветви:
HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\
Программы, установленные «для текущего пользователя», находятся здесь::
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
И ещё есть специальная ветвь в Windows x64:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
Поэтому для считывания программ с одним типом установки достаточно просмотреть одну из этих ветвей, а для получения полного списка установленных программ на компьютере потребуется просканировать все три ветви реестра, а затем объединить списки.
Написание команд и bat файлов
Просмотр ветви реестра и вывод списка установленных программ удаленного компьютера
Содержимое bat файла для печати списка программ, установленных для всех пользователей:
set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c
Если имя компьютера не задано, то печатаются сведения по локальному компьютеру.
Печать списка установленных программ по трем папкам реестра
Чтобы вывести информацию о всех программах, нужно просканировать все три ветви реестра:
set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c
set reg_key=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c
set reg_key=hkcu\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c
На выходе получится полный список установленных программ, но он может содержать одинаковые строки.
Упорядочивание списка программ
Убрать дублирование и отсортировать список по алфавиту можно с помощью встроенной команды sort.
set output=%temp%\programs.txt
if exist "%output%" del "%output%"
rem Программы для всех пользователей x64
set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c >> "%output%"
rem Программы для всех пользователей x86
set reg_key=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c >> "%output%"
rem Программы текущего пользователя
set reg_key=hkcu\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c >> "%output%"
rem Сортировка и удаление дублирования
sort "%output%" /unique
del "%output%"
Сначала все программы вносятся в общий файл списка, а затем команда sort удаляет дубликаты и сортирует список.
Как использовать список установленных программ
Проверить, что программа установлена на компьютере
Проверить, что определенная программа установлена на компьютере можно, применяя поиск find
или findstr
к списку программ. Например, проверить, что обновление KB2570791 установлено на компьютере WS_ALEX:
programs-sorted.bat | find /i "KB2570791"
Проверить, что программа установлена на нескольких компьютерах
Такую же проверку можно сделать в цикле имен компьютеров.
@echo off rem %1 Полное название программы или часть названия программы. rem %2 Имя файла со списком компьютеров. for /F %%a in (%2) do ( echo %%a... call programs-sorted.bat %%a | find /i "%~1" )
Пример списка файлов pc.list
SERVER_DB SERVER_FILES WS_ALEX WS_RECEPTION
Скачивание и установка
Загрузка файлов
Скачать bat файлы можно по ссылке:
Некоторые bat файлы используют программу nhcolor для выделения текста цветом, поэтому потребуется также скачать программу nhcolor по ссылке ниже. Если выделение цветом не требуется, то её вызов можно заменить на команду echo
.
Вопросы и ответы
Какие особенности запуска bat файлов?
bat файлы должны быть запущены с административными полномочиями по отношению к удаленным компьютерам.
Узнать больше
Получение списка установленных программ в VBS скрипте
Просмотреть ветвь реестра можно также в WSH скрипте, например, этот код на VBScript (взят с сайта Майкрософт) перечисляет программы, установленные для всех пользователей, при этом выводит дополнительную информацию, по сравнению с bat файлом: дату установки, номер версии программы, примерный размер на диске:
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE strComputer = "computer" strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" strEntry1a = "DisplayName" strEntry1b = "QuietDisplayName" strEntry2 = "InstallDate" strEntry3 = "VersionMajor" strEntry4 = "VersionMinor" strEntry5 = "EstimatedSize" Set objReg = GetObject("winmgmts://" & strComputer & _ "/root/default:StdRegProv") objReg.EnumKey HKLM, strKey, arrSubkeys WScript.Echo "Installed Applications (" & strComputer & ")" & VbCrLf For Each strSubkey In arrSubkeys intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _ strEntry1a, strValue1) If intRet1 <> 0 Then objReg.GetStringValue HKLM, strKey & strSubkey, _ strEntry1b, strValue1 End If If strValue1 <> "" Then WScript.Echo VbCrLf & "Display Name: " & strValue1 End If objReg.GetStringValue HKLM, strKey & strSubkey, _ strEntry2, strValue2 If strValue2 <> "" Then WScript.Echo "Install Date: " & strValue2 End If objReg.GetDWORDValue HKLM, strKey & strSubkey, _ strEntry3, intValue3 objReg.GetDWORDValue HKLM, strKey & strSubkey, _ strEntry4, intValue4 If intValue3 <> "" Then WScript.Echo "Version: " & intValue3 & "." & intValue4 End If objReg.GetDWORDValue HKLM, strKey & strSubkey, _ strEntry5, intValue5 If intValue5 <> "" Then WScript.Echo "Estimated Size: " & Round(intValue5/1024, 3) & " megabytes" End If Next
Этот скрипт печатает каждый параметр на отдельной строке, то есть каждая программа занимает несколько строк:
Но если необходим другой формат, то его нетрудно задать в коде скрипта, например, выводить в одну строку или в формате CSV,
Команда sort
В bat файле полного списка установленных программ programs-sorted.bat используется команда sort для сортировки списка и удаления одинаковых строк.
Справку по команде sort лучше смотреть на сайте Microsoft, например, по ссылке sort, хотя страница и указана как относящаяся к Windows Server. Встроенная справка sort /?
или help sort
не показывает параметр /unique
, хотя он работает (Windows 10).
Вопрос по скрипту на VBS, в тексте указано что он обходит только одну ветку.
Поэтому если мне необходимо получить полный список, то необходимо обойти еще две оставшиеся.
Вопрос в следующем, как можно отсортировать получаемый список программ и не допустить появление дублей?
Командой sort можно отсортировать список и удалить дубли. Эта команда хорошо подходит для варианта с bat файлами, где выводится по одной строке на каждую программу.
Пример VBS скрипта выводит по несколько строк на программу, поэтому сортировка и чистка такого текста потребует дополнительных усилий.
а как бы ещё версию добавить или другой параметр ?
GLS
GLS
Командный файл, который перечисляет все программы (компьютера и пользователя, 32/64 бита):
@echo off
echo *** Local Machine x64 Programs
set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
for /F «tokens=1,2,*» %%a in (‘reg query «%reg_key%» /s’) do ^
if «%%a» == «DisplayName» echo %%c
echo *** Local Machine x32 Programs
set reg_key=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
for /F «tokens=1,2,*» %%a in (‘reg query «%reg_key%» /s’) do ^
if «%%a» == «DisplayName» echo %%c
echo *** Current User programs
set reg_key=hkcu\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
for /F «tokens=1,2,*» %%a in (‘reg query «%reg_key%» /s’) do ^
if «%%a» == «DisplayName» echo %%c