2010-08-11 35 views
13

thể trùng lặp:
Is there an equivalent of ‘which’ on windows?unix "java" lệnh tương đương trên cửa sổ?

Không thể tìm thấy nó trên Google, nhưng chỉ tự hỏi nếu có một cách để lộ vị trí của java bởi một lệnh tương đương từ Windows nhắc.

Về cơ bản tôi có thông tin từ khách hàng rằng anh ấy không đặt JAVA_HOME nhưng vẫn có thể chạy các chương trình java. Tôi nghi ngờ nó sau đó phải bởi vì đường dẫn đến java được thiết lập trong biến môi trường PATH của hệ thống, nhưng đó chỉ là quá dài để lặp lại một cách nhanh chóng, cũng rất đau đớn (phải đào sâu vào các thư mục con).

Cảm ơn mọi đề xuất trước!

+0

Quá dài để lặp lại? Tạo một kịch bản/chương trình nhỏ lặp lại nó cho bạn. Chỉ cần tách biệt bằng ";" Không cần phải đào sâu vào các thư mục con. – OscarRyz

+3

Lưu ý: 'JAVA_HOME' sẽ trỏ đến JDK. Chạy các chương trình Java không phải mỗi yêu cầu JDK, chỉ cần một JRE cũng đủ. Đại đa số người cuối cùng chỉ có một JRE. – BalusC

+0

@OscarRyz: đó là doable, tôi chỉ tò mò cho dù có một cách trực tiếp nói cho vị trí của java bằng cách thực hiện một lệnh đơn giản từ cmd :) –

Trả lời

27

Bạn có thể thử:

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

Đây là một tính năng của Windows for lệnh và bạn có thể sử dụng for /? để có được những thông tin chi tiết:

 
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: giải pháp tuyệt vời, tôi có thể biết đây là kịch bản lệnh power-shell không? hay không? –

+1

Không, tiêu chuẩn 'cmd.exe'. Rất nhiều người dường như nghĩ rằng nó đã không thay đổi kể từ phiên bản DOS chết não nhưng nó thực sự là một cách công bằng. Không nơi nào gần như tốt như 'bash' yêu quý của tôi tất nhiên, nhưng hoàn toàn khả thi :-) – paxdiablo

+0

Có thể thực hiện được. Ugly chắc chắn !! Bạn không thích cách họ thực hiện điều này như một trường hợp đặc biệt cho lệnh 'for' ... chứ không phải là một tính năng chung của% thay thế biến. –

2

Dưới đây là những gì tôi thường sử dụng. Nếu hôm nay tôi làm lại, tôi có thể làm điều đó một chút khác biệt, nhưng nó hoạt động tốt đến mức tôi chưa thực sự có lý do gì để xem nó trong nhiều năm (thực tế, tôi chắc chắn là lần cuối cùng tôi đã làm bất cứ điều gì để nó được thêm vào "cmd" vào danh sách các phần mở rộng khi tôi chuyển nó từ 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

những câu trả lời khác nhìn tốt. để hoàn chỉnh, tôi sẽ thêm rằng bạn nó cũng không phải là thanh lịch như các giải pháp khác, nhưng nó sẽ làm việc và bạn sẽ không phải lo lắng về phiên bản nào của java mà khách hàng có.

3

Tôi có thiếu gì đó ở đây không? Điều gì về thử các fol hạ dòng lệnh đơn giản?

c:> dir/s java.exe

hoặc

c:> dir/s javaw.exe

Họ sẽ mất thời gian, nhưng họ sẽ làm việc. Nếu bạn muốn làm cho nhanh hơn, hãy bắt đầu tại "c: \ Program files"

+1

Cách tiếp cận "tìm" giống như của bạn chắc chắn là tốt. Câu trả lời được chấp nhận kiểm tra biến môi trường hệ thống% PATH% vì nếu dưới bất kỳ thư mục nào "java -version" là tốt thì nó thường có nghĩa là vị trí java.exe đã được thêm vào đường dẫn hệ thống. Vì vậy, tôi nghĩ rằng nó là tốt hơn về tốc độ :) –

Các vấn đề liên quan