2010-08-11 15 views
13

Powiel możliwe:
Is there an equivalent of ‘which’ on windows?Jednoznaczne polecenie "co java" w systemie Windows?

Nie udało się go znaleźć w Google, ale po prostu zastanawiam się, czy istnieje sposób, aby ujawnić lokalizację java równoważną z wiersza polecenia systemu Windows.

Zasadniczo mam informacje od klienta, że ​​nie ustawia JAVA_HOME, ale nadal może uruchamiać programy java. Podejrzewam, że wtedy musi, ponieważ ścieżka do tej java jest ustawiona w zmiennej środowiskowej PATH systemu, ale to jest zbyt długie, aby szybko iterować, również bardzo bolesne (trzeba przekopać się na podfoldery).

Dzięki za wszelkie sugestie z góry!

+0

Zbyt długi czas na powtórzenie? Utwórz skrypt/mały program iterujący go dla ciebie. Po prostu oddziel je przez ";" Nie ma potrzeby kopiowania do podfolderów. – OscarRyz

+3

Uwaga: 'JAVA_HOME' powinien wskazywać na JDK. Uruchamianie programów Java nie wymaga JDK, wystarczy tylko środowisko JRE. Ogromna większość użytkowników końcowych ma tylko środowisko JRE. – BalusC

+0

@OscarRyz: To jest wykonalne, jestem tylko ciekawy, czy istnieje bezpośredni sposób na określenie lokalizacji java poprzez wykonanie prostego polecenia z cmd :) –

Odpowiedz

27

Można spróbować:

c:\> for %i in (java.exe) do @echo. %~$PATH:i 
    C:\WINDOWS\system32\java.exe 

Jest to funkcja polecenia systemu Windows for i można korzystać for /? aby uzyskać szczegółowe informacje:

 
In addition, substitution of FOR variable references has been enhanced. 
You can now use the following optional syntax: 
    %~I   - expands %I removing any surrounding quotes (") 
    %~fI  - expands %I to a fully qualified path name 
    %~dI  - expands %I to a drive letter only 
    %~pI  - expands %I to a path only 
    %~nI  - expands %I to a file name only 
    %~xI  - expands %I to a file extension only 
    %~sI  - expanded path contains short names only 
    %~aI  - expands %I to file attributes of file 
    %~tI  - expands %I to date/time of file 
    %~zI  - expands %I to size of file 
    %~$PATH:I - searches the directories listed in the PATH 
        environment variable and expands %I to the 
        fully qualified name of the first one found. 
        If the environment variable name is not 
        defined or the file is not found by the 
        search, then this modifier expands to the 
        empty string 

The modifiers can be combined to get compound results: 
    %~dpI  - expands %I to a drive letter and path only 
    %~nxI  - expands %I to a file name and extension only 
    %~fsI  - expands %I to a full path name with short names only 
    %~dp$PATH:I - searches the directories listed in the PATH 
        environment variable for %I and expands to the 
        drive letter and path of the first one found. 
    %~ftzaI  - expands %I to a DIR like output line 

In the above examples %I and PATH can be replaced by other valid 
values. The %~ syntax is terminated by a valid FOR variable name. 
Picking upper case variable names like %I makes it more readable and 
avoids confusion with the modifiers, which are not case sensitive. 
+0

@paxdiablo: fantastyczne rozwiązanie, czy mogę wiedzieć, że jest to skrypty power-shell? albo nie? –

+1

Nie, standardowe "cmd.exe". Wiele osób wydaje się myśleć, że nie zmieniło się od wersji DOS, która nie działa w mózgu, ale w rzeczywistości jest w porządku. Nigdzie nie jest tak dobry jak mój ukochany 'bash' oczywiście, ale funkcjonalny :-) – paxdiablo

+0

Możliwe do wykonania. Brzydko zdecydowanie !! Nie podoba ci się, jak implementują to jako specjalny przypadek dla polecenia 'for', a nie jako ogólną cechę zastępowania zmiennych%. –

2

Oto co normalnie używać. Gdybym robił to ponownie dzisiaj, prawdopodobnie zrobiłbym to trochę inaczej, ale działa to na tyle dobrze, że nie miałem żadnego powodu, aby patrzeć na to od lat (w rzeczywistości, jestem pewien, że po raz ostatni zrobiłem nic do niego dodawał „cmd” do listy rozszerzeń, kiedy przeniósł się z DOS Win32 ...

// Which.c: 
#include <io.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char *extensions[] = { "com", "exe", "bat", "cmd", NULL }; 

int is_exe(char *ext) { 

    int i; 

    for (i = 0; extensions[i]; i++) 
     if (0 == stricmp(ext, extensions[i])) 
      return 1; 
    return 0; 
} 

int main(int argc, char **argv) { 

    char path[FILENAME_MAX]; 
    char buffer[FILENAME_MAX]; 
    char *path_var; 
    char *ext; 
    char *dir; 
    int i; 

    if (argc != 2) { 
     fprintf(stderr, "Usage: which <filename>\n"); 
     return 1; 
    } 

/* First try to find file name as-is. 
*/ 
    if (0 == access(argv[1], 0)) { 
     printf("\n%s", argv[1]); 
     return 0; 
    } 

/* Okay, it wasn't found. See if it had an extension, and if not, try 
* adding the usual ones... 
*/ 

    ext = strrchr(argv[1], '.'); 

    if (0 == ext++ || !is_exe(ext)) { 
     for (i = 0; extensions[i]; i++) { 

      sprintf(buffer, "%s.%s", argv[1], extensions[i]); 

      if (0 == access(buffer, 0)) { 
       printf("\n%s", buffer); 
       return 0; 
      } 
     } 

     if (NULL == (path_var=getenv("PATH"))) 
      return 1; 

     dir = strtok(path_var, ";"); 
     do { 
      for (i = 0; extensions[i]; i++) { 

       sprintf(buffer, "%s\\%s.%s", dir, argv[1], extensions[i]); 

       if (0 == access(buffer, 0)) { 
        printf("\n%s", buffer); 
        return 0; 
       } 
      } 
     } while (NULL != (dir = strtok(NULL, ";"))); 
    } 

    else { 
     if (NULL == (path_var=getenv("PATH"))) 
      return 1; 

     dir = strtok(path_var, ";"); 
     do { 
      sprintf(buffer, "%s\\%s", dir, argv[1]); 

      if (0 == access(buffer, 0)) { 
       printf("\n%s", buffer); 
       return 0; 
      } 
     } while (NULL != (dir = strtok(NULL, ";"))); 
    } 
    return 1; 
} 
1

innych odpowiedzi dobrze wyglądać. dla uzupełnienia dodam, że ciebie może również dystrybuować środowisko JRE z aplikacją, nie jest tak elegancka jak inne rozwiązania, ale zadziała i nie będziesz musiał się martwić o wersję klienta Java, która ma wersję klienta, java

3

Czy brakuje mi tutaj czegoś? A co powiesz na próbowanie? niwelowanie prostych linii poleceń?

c:> dir/s java.exe

lub

c:> dir/s javaw.exe

Zabiorą czasu, ale będą pracować. Jeśli chcesz przyspieszyć, zacznij od "c: \ Program files"

+1

Twoje "podobne" podejście jest zdecydowanie w porządku. Akceptowana odpowiedź sprawdza zmienną środowiskową System% PATH%, ponieważ jeśli pod jakimkolwiek katalogiem "java -version" jest w porządku, zazwyczaj oznacza to, że do ścieżki systemowej została dodana lokalizacja java.exe. Więc myślę, że jest lepsza pod względem szybkości :) –

Powiązane problemy