Reputation: 10641
Is there any way to open the command prompt and change directory in the command prompt and run the batch file in the same command prompt using java.
I know how to open the command prompt using java. Thanks,
Upvotes: 3
Views: 32484
Reputation: 29342
Be wary of Java's exec. It can hang if the batch process fills the output buffer, and cause other weird problems.
I suggest you look at apache exec. Specifically for your needs you should note that the Executor interface has a setWorkingDirectory method.
Basic usage:
Executor exec = new DefaultExecutor();
exec.setWorkingDirectory(new File("C:\\My\\Dir\\"));
CommandLine cl = new CommandLine("mybatch.bat");
int exitvalue = exec.execute(cl);
Upvotes: 7
Reputation: 64065
You can encode the CD and the batch file in the value for cmd.exe /K. From the doco (cmd /?):
Note that multiple commands separated by the command separator '&&' are accepted for string if surrounded by quotes.
For Example:
cmd /C "CD C:\ && Dir"
cmd /C "CD C:\Windows && Dir"
cmd /C "CD C:\Windows && MySuperSuperBatchFile"
For more detail, run:
cmd /?
from the command line.
Upvotes: 8
Reputation: 28258
A couple of the java.lang.Runtime.exec() variations does have a dir argument, so I assume you are not thinking of that?
You can compile the following C program and execute as a wrapper to start any program in any directory you want. If you use a String array with Runtime.exec you will avoid all issues of command line parsing/portability/proper quoting of the arguments.
I do not have any windows machine to test on here, but if you compile the C program to cdexe.exe you should be able to use it as the following:
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();
}
}
}
I guess unistd.h is maybe not available on windows, but just substitute with one containing a execv prototype.
#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;
}
Upvotes: 2
Reputation: 1952
get the environment var "comspec" then exec %comspec% /c start/d directory /b batchfile.bat
Upvotes: 0
Reputation: 310
Keep the batch file in "path". You can execute it without going to any specific directory.
(For example you can have an entry "set path=%path%;C:..........\YourBatchFile.bat" in Autoexec.bat in Windows environment)
Upvotes: -1
Reputation: 112414
It's difficult to do from Java for goofy platform-independence reasons: basically what if you're running java on a system that doesn't have hierarchical directories?
There are a number of workarounds depending on what you're really trying to do, but possibly the simplest is to run the eventual command using
java.lang.Runtime.exec()
.
.
Upvotes: 0