最近由于工作需要,使用java在调用cmd程序时,为了避免在路径当中有多个空格(例如:c:\\aa a\t t\m m),所以使用了
Runtime time = Runtime.getRuntime();
try{
time.exec(new String[]{"Sp.exe"}, null, new File(args[1]));
}catch(Exception e){
e.printStackTrace();
}
遇到了java.io.IOException: CreateProcess error=2, ?????????异常,找了很多原因都没有弄明白,然而使用
time.exec(new String[]{"java","-jar","Sp.jar"}, null, new File(args[1]));就可以!
如果使用:(前提是不能有不规则的空格出现)
Runtime time = Runtime.getRuntime();
try{
String command = "args[1]"+File.separator+Sp.exe;
time.exec(command);
}catch(Exception e){
e.printStackTrace();
}
也可以,同样在底层都是使用的ProcessBuilder去创建的进程,只是传递的参数不一样,结果就不一样。
我的理解是,在java中去执行exe文件,使用第一种方式,目录中windows在执行程序Sp.exe时,与主程序的工作目录不一样,就是说user.dir不一样,因为进程的工作目录不同,所以在创建进程时报错。
虽然你能在java程序中遍历到你需要的文件。
为了避免出现多个空格的情况,继续实验,最终找到了解决的方案:
Runtime time = Runtime.getRuntime();
try{
time.exec(new String[]{"cmd","/c","Sp.exe"}, null, new File(args[1]));
}catch(Exception e){
e.printStackTrace();
}
cmd /c中具体含义,你在dos中输入 cmd /?就可以查看