2010-08-11 8 views
13

Possible en double:
Is there an equivalent of ‘which’ on windows?unix "quel java" commande équivalente sur Windows?

Impossible de trouver sur Google, mais demandais s'il y a un moyen de révéler l'emplacement de Java par une commande équivalente d'une invite Windows.

Fondamentalement, j'ai des informations du client qu'il ne définit pas le JAVA_HOME mais peut toujours exécuter des programmes Java. Je le soupçonne alors parce que le chemin vers ce java est défini dans la variable d'environnement système PATH, mais c'est trop long pour itérer de manière rapide, aussi très pénible (il faut creuser dans des sous-dossiers).

Merci pour votre suggestion à l'avance!

+0

Trop long pour itérer? Créez un script/petit programme qui le répète pour vous. Juste séparer par ";" Il n'y a pas besoin de creuser dans les sous-dossiers. – OscarRyz

+3

Remarque: 'JAVA_HOME' doit pointer sur JDK. L'exécution de programmes Java ne nécessite pas de JDK, mais un JRE suffit également. La grande majorité des utilisateurs finaux ont juste un JRE. – BalusC

+0

@OscarRyz: c'est faisable, je suis juste curieux de savoir s'il y a un moyen direct de dire l'emplacement de java en exécutant une simple commande de cmd :) –

Répondre

27

Vous pouvez essayer:

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

C'est une caractéristique de la commande Windows for et vous pouvez utiliser for /? pour obtenir les détails:

 
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: solution fantastique, puis-je savoir que c'est un script power-shell? ou pas? –

+1

Non, standard 'cmd.exe'. Beaucoup de gens semblent penser que cela n'a pas changé depuis la version DOS, mais c'est en fait juste. Nulle part près aussi bon que mon bien-aimé 'bash' bien sûr, mais réalisable :-) – paxdiablo

+0

Peut-être réalisable. Ugly définitivement !! N'aimes-tu pas comment ils implémentent cela comme un cas particulier pour la commande 'for' ... plutôt que comme une caractéristique générale de la substitution de variable%. –

2

Voici ce que je l'habitude d'utiliser. Si je le faisais encore aujourd'hui, je le ferais probablement un peu différemment, mais ça marche assez bien pour que je n'ai pas vraiment eu de raison de le regarder pendant des années (en fait, je suis sûr que la dernière fois Je l'ai fait quoi que ce soit à ce ajoutais « cmd » à la liste des extensions quand je l'ai porté de 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

les autres réponses semblent bonnes. pour être complet, je vais ajouter que vous peut également distribuer le JRE avec votre application.Il n'est pas aussi élégant que les autres solutions, mais cela fonctionnera et vous n'aurez pas à vous soucier de la version de java que le client possède

3

Ai-je raté quelque chose ici? Qu'en est-il d'essayer le fol abaissant les lignes de commande simples?

c:> dir/s java.exe

ou

c:> dir/s javaw.exe

Ils prendront du temps, mais ils vont travailler. Si vous voulez le rendre plus rapide, commencez par "c: \ Program files"

+1

Votre approche "find" est vraiment bien. La réponse acceptée vérifie la variable d'environnement système% PATH% car si sous un répertoire "java -version" est correct, cela signifie généralement que l'emplacement de java.exe a été ajouté au chemin du système. Donc je pense que c'est mieux en termes de vitesse :) –