【问题标题】:Find a executable file path programmatically and fast以编程方式快速查找可执行文件路径
【发布时间】:2013-12-16 23:27:23
【问题描述】:

我想在 Java 中以编程方式查找 .exe 文件路径,例如:

  • Skype.exe 被输入到程序中以找到它的直接路径
  • 程序执行查找文件路径的算法
  • 程序返回文件路径C:\Users\Public\Desktop\Skype.exe

我尝试过的一种方法是对系统文件进行排序,直到找到“skype.exe”,但这会占用大量时间和资源。

是否有任何 hack 可以让它几乎是即时的,比如可能是 Win_Api 函数/cmd 命令,或者正在对文件系统进行排序,直到找到程序的唯一方法?

【问题讨论】:

  • 优先考虑可执行文件的常见位置可能有助于在普通系统上加快这一速度。除此之外,我一无所有。
  • 我认为及时完成此操作的唯一方法是使用Jawin 与 Windows 库交互,然后实现类似于在最近访问的“开始菜单”搜索功能上运行的功能C:\ProgramData\Microsoft\Windows\Start Menu\Programs 中存在的文件和快捷方式。甚至可以使用 Windows 库来做到这一点。当然需要更多的研究。
  • 正在寻找任何exe 文件,或者快速找到“已安装”exe 文件的解决方案是否足够?
  • 这实际上可以工作,通过安装的exe文件
  • 开始在 PATH 中查找。

标签: java file path


【解决方案1】:

我确实找到了一些可行的方法,虽然不是最快的,但只需要大约 100 毫秒 - 500 毫秒,具体取决于 exe。

您需要使用运行时进程来执行此操作。

基本上你进入驱动器的根目录,然后在 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:\Users\Mitchell\workspace\Remote Admin>cd \ 

C:\>dir /s /b eclipse.exe 
C:\eclipse\eclipse.exe

【讨论】:

    【解决方案2】:

    作为@Minor's answer 的扩展,如果您想通过将搜索限制为仅搜索当前在 Windows 上“安装”的程序来提高性能,以下注册表项包含有关“已安装”程序的信息。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    

    使用 powershell,您可以访问存储在这些密钥中的已安装软件的属性。特别感兴趣的是InstallLocation 属性。

    然后,您只需修改 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.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 中运行良好。不过从概念上讲,这个解决方案是合理的。

    【讨论】:

      【解决方案3】:

      如果您想知道当您键入 .使用 which/where 命令..

      Unix/linux/Mac OSX Possix 哪个>

      哪个 chmod 哪个光盘 哪一个 哪个我的程序

      如果不存在这样的程序文件,则不返回任何内容。

      对于 Windows 使用 where 在哪里> /?寻求有关此命令的帮助

      如果您没有可执行文件,但有别名或某种环境函数/过程/shell 命令.. 在 Unix/linux/Mac OS X 上使用 type> 命令。如果您正在处理别名、环境函数或可执行文件,它将告诉您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多