Esto es lo que normalmente utilizo. Si lo estuviese haciendo otra vez hoy, probablemente lo haría de manera un poco diferente, pero funciona lo suficientemente bien como para no tener ningún motivo para mirarlo durante años (de hecho, estoy bastante seguro de que la última vez hice nada a ella añadía "cmd" en la lista de extensiones cuando portado desde DOS para 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;
}
¿Demasiado tiempo para iterar? Cree un script/pequeño programa que lo itere por usted. Solo separe por ";" No hay necesidad de profundizar en las subcarpetas. – OscarRyz
Nota: 'JAVA_HOME' debe apuntar a JDK. Ejecutar programas Java no requiere JDK, solo un JRE también es suficiente. La gran mayoría de los usuarios finales solo tienen un JRE. – BalusC
@OscarRyz: eso es factible, solo tengo curiosidad de saber si hay una manera directa de indicar la ubicación de java ejecutando un comando simple desde cmd :) –