2013-12-16 94 views
6

我希望通過編程在Java中找到一個.exe文件的路徑,例如:編程查找可執行文件的路徑和快速

  • Skype.exe的輸入到一個程序,找出它的直接路徑
  • 計劃確實是找到了文件路徑
  • 計劃返回文件路徑C的算法:\用戶\公用\桌面\ Skype.exe的

我曾嘗試是通過分揀系統文件,直到「Skype的一種方法, .exe「被找到,但這佔用了大量的時間和資源。

是否有任何黑客可以使它幾乎是即時的,就像一個Win_Api函數/ cmd命令或通過文件系統排序,直到找到程序的唯一方式?

+1

對可執行文件的常見位置進行優先排序可能有助於在平均系統上加快速度。除此之外,我什麼都沒有。 – DeathByTensors

+0

我可以想到這一點的唯一方法是及時完成,使用[Jawin](http://jawinproject.sourceforge.net/)與Windows庫進行交互,然後實現類似於「開始菜單」搜索功能的東西可以在最近訪問過的文件和快捷方式下運行在C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs中。使用Windows庫甚至可以做到這一點。當然需要更多的研究。 –

+0

正在尋找任何'exe'文件,或者一個解決方案能夠很快找到「安裝」的'exe'文件就足夠了嗎? –

回答

1

我實際上發現了一些可行的東西,雖然不是最快的,但只需要100ms左右 - 取決於exe的500ms。

您需要使用運行時進程來執行此操作。

基本上你進入驅動器的根目錄,然後在cmd中使用這些命令搜索文件系統。

cd \ 
dir /s /b mytool.exe 

這將返回文件路徑。

我爲它的代碼:

(hackish的我知道)

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」 的bat文件1):

cd \ 
dir /s /b %1 
exit 

輸出成爲:

C:\Users\Mitchell\workspace\Remote Admin>cd \ 

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

作爲@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例如通過複製返回getInstalledPrograms.bat InstallLocations,雖然腳本可以在CMD罰款。但從概念上來說,這個解決方案很合理。

0

如果您想知道WHICH可執行文件在鍵入時是否從命令行執行。使用該/在命令..

的Unix/Linux/Mac OSX上Possix < >

該文件模式 其中CD 其中LS 其中myprogram

返回返回什麼,如果沒有這樣的程序文件存在。

for Windows use where < where> /?關於此命令的幫助

如果你沒有一個可執行的,而是一個別名或某種環境功能/程序/ shell命令..使用的< 型>命令在Unix/Linux/Mac OS X的如果你正在處理別名,環境函數或可執行文件,這將告訴你。