unix“哪个java”在Windows上的等效命令?

可能重复:
是否有相当于Windows的“哪个”?

无法在Google上find它,但只是想知道是否有方法通过Windows提示符的等效命令显示java的位置。

基本上我从客户端的信息,他没有设置JAVA_HOME,但仍然可以运行Java程序。 我怀疑它是必须的,因为这个java的path是在系统PATH环境variables中设置的,但是这太快而不能快速迭代,也非常痛苦(必须挖掘到子文件夹)。

提前感谢您的任何build议!

你可以试试:

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

这是Windows for命令的一个功能,您可以使用for /? 获取详细信息:

另外,FOR变量引用的替换已被增强。
您现在可以使用以下可选语法:
     %〜I  - 扩展%我删除任何周围的引号(“)
     %〜fI  - 将%I扩展为完全限定的路径名​​称
     %〜dI  - 只将%I扩展为一个盘符
     %〜pI  - 仅将%I扩展到路径
     %〜nI  - 只将%I扩展为文件名
     %〜xI  - 仅将%I扩展为文件扩展名
     %〜sI  - 扩展路径只包含短名称
     %〜aI  - 将%I扩展到文件的文件属性
     %〜tI  - 将%I扩展到文件的日期/时间
     %〜zI  - 将%I扩展为文件的大小
     %〜$ PATH:I  - 搜索PATH中列出的目录
                   环境变量并将%I扩展到
                   第一个找到的完全合格的名字。
                   如果环境变量名称不是
                   定义或文件没有被找到的
                   搜索,然后这个修饰符扩展到
                   空的字符串

修饰符可以组合得到复合结果:
     %〜dpI  - 仅将%I扩展为驱动器号和路径
     %〜nxI  - 仅将%I扩展为文件名和扩展名
     %〜fsI  - 将%I扩展为仅包含短名称的完整路径名称
     %〜dp $ PATH:I  - 搜索PATH中列出的目录
                   环境变量为%I并扩展为
                   驱动器号和找到的第一个路径。
     %〜ftzaI  - 将%I扩展为类似于输出行的DIR

在上面的例子中,%I和PATH可以被其他有效的替换
值。  %〜语法由一个有效的FOR变量名称终止。
采用大写字母变量名称,如%I,使其更具可读性
避免与修饰符混淆,修饰符不区分大小写。

这是我通常使用的。 如果我今天再做一次,我可能会做得有点不一样,但是它的效果已经足够好了,我没有任何理由多年来看它(事实上,我很确定上次我做了任何事情 ,当我把它从DOS移植到Win32的扩展名列表中添加“CMD”…

 // 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; } 

我在这里错过了什么? 尝试下面的简单命令行怎么样?

c:> dir / s java.exe

要么

c:> dir / s javaw.exe

他们需要时间,但他们会工作。 如果你想让速度更快,从“c:\ Program files”开始

其他答案看起来不错。 为了完整起见,我将补充一点,您还可以将JRE与您的应用程序一起分发。 它不像其他解决方案那么优雅,但是它可以工作,而且不必担心客户端具有哪个版本的Java。