Ein paar der java.lang.Runtime.exec() Variationen haben ein "dir"-Argument, also nehme ich an, dass Sie nicht daran denken?
Sie können das folgende C-Programm kompilieren und als Wrapper ausführen, um ein beliebiges Programm in einem beliebigen Verzeichnis zu starten. Wenn Sie ein String-Array mit Runtime.exec verwenden, vermeiden Sie alle Probleme mit dem Parsen von Befehlszeilen, der Portabilität und der korrekten Quotierung der Argumente.
Ich habe keinen Windows-Rechner zum Testen hier, aber wenn Sie das C-Programm zu cdexe.exe kompilieren, sollten Sie es wie folgt verwenden können:
public class Main {
public static void main(String args[]) {
String[] s = { "c:\\some\\place\\cdexe.exe",
"c:\\start\\dir", "c:\\my\\batch\\file.bat", "arg1", "..." };
try {
java.lang.Runtime.getRuntime().exec(s);
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
}
Ich vermute, dass unistd.h unter Windows nicht verfügbar ist, aber ersetzen Sie sie einfach durch eine Datei, die einen execv-Prototyp enthält.
#include <stdio.h>
#include <unistd.h> // or hard code "int execv(const char *path, char *const argv[]);"
int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Error: Usage: %s <directory> <program> [arguments]\n", argv[0]);
return 1;
}
if (chdir(argv[1]) < 0) {
perror("Error");
fprintf(stderr, "chdir(%s) failed\n", argv[1]);
return 1;
}
argv[1] = argv[2];
execv(argv[1], &argv[2]); // use execvp if you want PATH to be searched
perror("Error");
fprintf(stderr, "execv returned\n");
return 0;
}