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;
}
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
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
@OscarRyz: To jest wykonalne, jestem tylko ciekawy, czy istnieje bezpośredni sposób na określenie lokalizacji java poprzez wykonanie prostego polecenia z cmd :) –