以编程方式快速查找可执行文件路径



我想用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上键入>命令。这将告诉您是在处理别名、环境函数还是可执行文件。

相关内容

  • 没有找到相关文章