我想用Java程序找到一个.exe文件路径,例如:
- Skype.exe被输入到程序中,以找到它的直接路径
- 程序执行查找文件路径的算法
- 程序返回文件路径C:\Users\Public\Desktop\Skype.exe
我尝试过的一种方法是对系统文件进行排序,直到找到"skype.exe",但这会占用大量时间和资源。
有没有什么黑客可以让它几乎是即时的,比如Win_Api函数/cmd命令,或者在文件系统中排序,直到找到程序的唯一方法?
我确实找到了一些有效的方法,尽管不是最快的,但根据exe的不同,只需要大约100ms-500ms。
您需要使用运行时进程来执行此操作。
基本上,您进入驱动器的根目录,然后使用cmd中的这些命令搜索文件系统。
cd
dir /s /b mytool.exe
这将返回文件路径。
我的代码:
(我知道黑客)
try {
Process p = Runtime.getRuntime().exec("./res/getPrograms.bat " + exeName);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while(true) {
line = input.readLine();
if(line == null) {
break;
}
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
和.bat文件(我将参数"eclipse.exe"传递给表示为%1的bat文件):
cd
dir /s /b %1
exit
输出变为:
C:UsersMitchellworkspaceRemote Admin>cd
C:>dir /s /b eclipse.exe
C:eclipseeclipse.exe
作为@Minor答案的扩展,如果您想通过将搜索限制在当前"已安装"在Windows上的程序来提高性能,以下注册表项包含有关"已安装的"程序的信息。
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall
使用powershell,您可以访问存储在这些密钥中的已安装软件的属性。特别令人感兴趣的是InstallLocation
属性。
然后,您只需修改Java代码,就可以使用另一个批处理脚本来检索这些安装位置,并专门针对exe
文件的这些安装位置。
getInstalledPrograms.bat
@echo off
powershell -Command "Get-ChildItem -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersionUninstall, HKLM:SOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall | Get-ItemProperty | Where-Object {$_.DisplayName -match "%1"} | Select-Object -Property InstallLocation"
exit
getPrograms.bat
@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示例与getInstalledPrograms.bat返回的InstallLocation
重复,尽管脚本在cmd中运行良好。不过,从概念上讲,这个解决方案是合理的。
如果您想知道在键入时从命令行执行哪个可执行文件。使用which/where命令。。
Unix/linux/Mac OSX Possix<哪个>
哪个chmod哪个cd哪个ls哪个我的程序
如果不存在这样的程序文件,return将不返回任何内容。
适用于Windows,其中<哪里>/?有关此命令的帮助
如果您没有可执行文件,但有一个别名或某种环境函数/process/shell命令。。使用<在Unix/linux/Mac OS X上键入>命令。这将告诉您是在处理别名、环境函数还是可执行文件。