我很可能误解了Runtime.exec(String command, String[] envp, File dir)中File dir
参数的目的:
“新子进程的工作目录由dir指定。如果dir为null,则子进程继承当前进程的当前工作目录。”
如果我运行Runtime.exec("C:/mydir/myfile.bat");
脚本被执行(尽管工作目录错误)
但是,如果我运行Runtime.exec("myfile.bat", null, new File("C:/mydir"));
,我会收到以下错误:
java.io.IOException: Cannot run program "myfile.bat" (in directory "C:\mydir"): CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at java.lang.Runtime.exec(Runtime.java:593)
我认为dir
参数设置新进程的工作目录以及正在执行的命令,但是它可能只是前者。如果是这种情况,则异常消息具有误导性。
答案 0 :(得分:3)
怎么样
Runtime.exec("C:\mydir\myfile.bat", null, new File("C:\mydir"));
来自ProcessBuilder.java
// It's much easier for us to create a high-quality error
// message than the low-level C code which found the problem.
这就是为什么你得到一个非特定的异常 - 否则JDK需要实现类似于Spring的DataAccessException层次结构的异常处理,处理操作系统特定的错误代码。
修改:您可能需要查看commons-exec
答案 1 :(得分:0)
我不知道它是否与它有关,但\用于转义字符。
我总是在Java中使用正斜杠,并且它们被正确转换。
否则我会建议总是使用\,即双斜线来避免像“C:\ newfile”那样的意外,这将是C:-newline-ewfile。