В качестве расширения к @Minor's answer, если вы хотите увеличить производительность, ограничив поиск только теми программами, которые в настоящее время установлены в Windows, следующие разделы реестра содержат информацию о «установленных» программах.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
С помощью powershell вы можете получить доступ к свойствам установленного программного обеспечения, хранящегося в этих ключах. Особый интерес представляет здесь IntallLocation
.
Затем вы просто модифицируете свой Java-код, чтобы использовать другой пакетный скрипт, который извлекает эти места установки, и специально предназначенный для этих мест установки для файлов exe
.
getInstalledPrograms.bat
@echo off
powershell -Command "Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object {$_.DisplayName -match \"%1\"} | Select-Object -Property InstallLocation"
exit
getPrograms.летучая
@echo off
cd %1
dir /b /s "*%2*.exe"
exit
Java Пример:
String search = "skype";
try {
Process getInstalled = Runtime.getRuntime().exec("./src/getInstalledPrograms.bat " + search);
BufferedReader installed = new BufferedReader(new InputStreamReader(getInstalled.getInputStream()));
String install;
String exe;
int count = 0;
while(true) {
install = installed.readLine();
if(install == null) {
break;
}
install = install.trim();
// Ignore powershell table header and newlines.
if(count < 3 || install.equals("")) {
count++;
continue;
}
Process getExes = Runtime.getRuntime().exec("./src/getPrograms.bat " + "\"" + install + "\"");
BufferedReader exes = new BufferedReader(new InputStreamReader(getExes.getInputStream()));
while(true) {
exe = exes.readLine();
if(exe == null) {
break;
}
exe = exe.trim();
System.out.println(exe);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
В настоящее время мой пример Java дублирует InstallLocations
возвращенное getInstalledPrograms.bat, хотя сценарий отлично в ЦМД работает. Концептуально, но это решение звучит.
Приоритезация общих местоположений исполняемых файлов может помочь ускорить это в средней системе. Кроме этого у меня ничего нет. – DeathByTensors
Единственный способ, которым я могу думать, что это делается своевременно, - использовать [Jawin] (http://jawinproject.sourceforge.net/) для взаимодействия с библиотеками Windows, а затем реализовать что-то похожее на функцию поиска «Меню« Пуск » который работает с недавно полученными файлами и сокращениями, присутствующими в 'C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs'. Можете даже сделать это с помощью библиотек Windows. Разумеется, необходимы дополнительные исследования. –
Ищите какие-либо файлы 'exe', или же решение, которое очень быстро находит« установленных »' exe' файлов достаточно? –