PDA

Показать полную графическую версию : [решено] Как вывести список установленных программ


Страниц : 1 [2]

oster2
26-06-2016, 17:08
PythonJ, практика показывает, что WMIC PRODUCT выводит далеко не полный список. подробнее можно посмотреть вот тут: https://sdmsoftware.com/group-policy-blog/wmi/why-win32_product-is-bad-news/

приведенный в начале топика скрипт не покажет программы, установленные локальным пользователем и 32битные программы на 64битной системе.
Вот более полный вариант:
@echo off
call :get_soft_list hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
call :get_soft_list hklm\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
call :get_soft_list hkcu\Software\Microsoft\Windows\CurrentVersion\Uninstall
goto the_end

:get_soft_list %1
for /F "tokens=1,2,*" %%a in ('reg query "%1" /s') do ^
if "%%a" == "DisplayName" echo %%c
exit /b

:the_end
по хорошему - сюда надо добавить проверку разрядности системы, удаление дубликатов, сортировку и удаление обновлений ("...update for...")

alpap
26-06-2016, 17:55
Самое удачное видел только на js:

// Скрипт Pf.js для получения содержимого папки %Programfiles%

var ShellAp, objFolder, objFolderItem, list, objItem, colItems;
var FSO, TempPath, TxtFile;

// получаем доступ к объекту Shell.Application
ShellAp = WScript.CreateObject("Shell.Application");
// получение объекта виртуальной папки проводника
objFolder = ShellAp.Namespace(38);
//Получаем объект FolderItem для текущей папки
objFolderItem = objFolder.Self;


list = "Содержимое папки:\n";
list +=objFolderItem.Path + "\n\n";


// получаем доступ к коллекции папок
colItems = new Enumerator(objFolder.Items());

//составляем список системных каталогов
for (; !colItems.atEnd(); colItems.moveNext()){
list += colItems.item().Path+ "\n";
}

ShowInNotepad(list)

//Функцияя временного файла с данными
function ShowInNotepad(StrToFile){
FSO = WScript.CreateObject("Scripting.FileSystemObject");
TempPath =
WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%") +
"\\" + FSO.GetTempName();
TxtFile = FSO.CreateTextFile(TempPath);
TxtFile.WriteLine(StrToFile);
TxtFile.Close();
WScript.CreateObject("WScript.Shell").Run ("notepad.exe " + TempPath);
}
.

oster2
26-06-2016, 20:59
alpap, imho ваше решение вообще из другой оперы :)
У нас тут топик CMD/BAT, а не JScript\VBScript, которые в разы побогаче
И задача Как вывести список установленных программ, а не "как вывести все папки в ProgramFiles" :)

alpap
26-06-2016, 22:25
а не "как вывести все папки в ProgramFiles »
Не все папки, а все из папки. Например, portable, как считать, установленными или нет, особенно если их ярлыки сидят для удобства в пуске. Скрипт js не проблема обернуть в bat, проблема на чистом cmd сделать то что хотите, так как на мое мнение даже использование, ничего не дающего в данном случае wmic, делает cmd "не чистым".

Iska
26-06-2016, 22:42
Например, portable, как считать, установленными или нет, особенно если их ярлыки сидят для удобства в пуске. »
Не считать. Установленными считаются приложения, перечисленные в реестре, как в разделе HKLM, так и HKCU.

alpap
27-06-2016, 15:16
oster2,
Ну попробовал ваш код:

@echo off
set "key1=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
set "key2=hklm\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
set "key3=hkcu\Software\Microsoft\Windows\CurrentVersion\Uninstall"
>>"file.txt" (
for %%a in (%key1%,%key2%,%key3%) do @(
for /f "tokens=2*" %%b in ('2^>nul reg query "%%a" /s^|find "DisplayName"^|find/v "Microsoft Visual C++"') do @echo:%%c
)
)
exit

изменил чуток
Пути не показывает и программы-то не все показывает, у меня есть установленные, но информации о ней в реестре, именно в ключе uninstall - нет, программа именно установлена. Так что на мой взгляд просмотр в папке %Programfiles%, нужен тоже, смотря для каких целей, конечно.

Iska
27-06-2016, 17:28
и программы-то не все показывает, у меня есть установленные, но информации о ней в реестре, именно в ключе uninstall - нет, программа именно установлена. »
О каком приложении речь?

alpap
27-06-2016, 20:17
О каком приложении речь? »
Нет, все-таки это портабельное приложение у меня, перепутал.
Так что только один минус кода выше, не выводит полные пути установленной программы, а надо как-то прикрутить.

oster2
27-06-2016, 22:32
alpap, посмотрите по ключам в тех разделах реестра, которые я указал
Вам поможет InstallLocation (где он есть)
Где нет - можно пытаться распарсить DisplayIcon, но тут уже придётся изголяться, чтоб сделать только средствами BAT\CMD. Наверное, проще будет использовать JS\VB-script.

vpatik
08-12-2016, 13:19
подскажите возможно ли , и как зделать чтоб вот такой скрипт кроме DisplayName виводил и InstallDate

@echo off
rem Этот командный файл записывает список программ, установленных на
rem удалённом компьютере.
rem %1 Сетевое имя компьютера в формате PCNAME (пустое значение означает
rem локальный компьютер).

rem Определяем путь к папке реестра
set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%

rem Перебираем установленные программы
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c



пример ESET Endpoint Antivirus -15.05.2016 (формат дати неважен)

Iska
08-12-2016, 14:14
и как зделать чтоб вот такой скрипт кроме DisplayName виводил и InstallDate »
Используйте (не проверялось):
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do (
if "%%a" == "InstallDate" <nul set /p sVar=%%c
if "%%a" == "DisplayName" <nul set /p sVar=%%c
echo.
)

oster2
08-12-2016, 14:23
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do (
if "%%a" == "DisplayName" echo %%c
if "%%a" == "InstallDate" echo %%c
)


можно заморочится и выводить в одну строчку, если надо

Iska
08-12-2016, 14:32
oster2, код перед Вашим сообщением именно так и делает.

oster2
08-12-2016, 14:42
Iska, отвлёкся на телефон пока писал ответ :)
А ваш код не выводит в одну строчку, а наоборот - добавляет много лишних переводов строки

Iska
08-12-2016, 15:06
Проверил. Именно так и есть.

Тогда так:
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do (
if "%%a" == "DisplayName" echo.& <nul set /p sVar=%%c
if "%%a" == "InstallDate" <nul set /p sVar=;%%c
)
Минусом идёт одна пустая строка в начале вывода




© OSzone.net 2001-2012