У пары java.lang.Runtime.exec () есть аргумент dir, поэтому я предполагаю, что вы не думаете об этом?
Вы можете скомпилировать следующую программу на C и выполнить ее как оболочку, чтобы запустить любую программу в любом каталоге, который вы хотите. Если вы используете массив String с Runtime.exec, вы избежите всех проблем, связанных с анализом командной строки / переносимостью / правильным цитированием аргументов.
У меня нет машины Windows для тестирования, но если вы скомпилируете C-программу для cdexe.exe, вы сможете использовать ее следующим образом:
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();
}
}
}
Я полагаю, что unistd.h может быть недоступен в Windows, но просто заменить на тот, который содержит прототип execv.
#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;
}