从Java代码中运行批处理文件

10

我正在尝试从我的Java可执行文件中运行另一个目录中的批处理文件。 我有以下代码:

    try {
        Process p =  Runtime.getRuntime().exec("cmd /c start \"C:\\Program Files\\salesforce.com\\Data Loader\\cliq_process\\upsert\\upsert.bat\"") ;           
    } catch (IOException ex) {
    }

结果是程序打开了一个命令窗口,在运行程序的根目录下,并未访问我提供的文件路径。


1
如果您在命令提示符窗口中输入“start /?”,它将描述start命令的选项;其中有一个“/D <path>”选项可能会有所帮助。 - ajb
5个回答

34
与其使用 Runtime.exec(String command) 方法,你需要使用 exec(String command, String[] envp, File dir) 函数签名:
Process p =  Runtime.getRuntime().exec("cmd /c upsert.bat", null, new File("C:\\Program Files\\salesforce.com\\Data Loader\\cliq_process\\upsert"));

但是个人而言,我会使用ProcessBuilder代替Runtime.exec(),虽然稍微冗长一些,但比起Runtime.exec()来说更易于使用和调试。

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "upsert.bat");
File dir = new File("C:/Program Files/salesforce.com/Data Loader/cliq_process/upsert");
pb.directory(dir);
Process p = pb.start();

1
Dir是之前我包含的相同路径吗?("\C:\Program Files\salesforce.com\Data Loader\cliq_process\upsert\upsert.bat") - Ricardo
如果您正在使用ProcessBuilder,我相信您不需要引号。 - MadProgrammer
1
@rob,最近我拒绝了一位用户的编辑请求(http://stackoverflow.com/review/suggested-edits/9107778),他声称他是为了一个编译错误而进行的编辑。如果确实存在这个错误,请修改您的答案。 - Lucky
1
问题已解决,保持命令窗口:- List cmdAndArgs = Arrays.asList(new String[]{"cmd.exe", "/C", "Start", "run.bat"}); - Saurabh Bhoomkar
2
@SaurabhBhoomkar 确定,只需将 /c 替换为 /k 即可。请注意,如果您的进程将大量信息写入 STDOUT 或 STDERR,则需要消耗这些流。您可以启动线程来读取进程的控制台流并将该输出写入您的 Java 程序的控制台和/或日志文件中。如果您不使用这些流,进程可能会阻塞并在缓冲区填满时似乎挂起。 - rob
显示剩余4条评论

6

请尝试以下步骤:

try {
            String[] command = {"cmd.exe", "/C", "Start", "D:\\test.bat"};
            Process p =  Runtime.getRuntime().exec(command);           
        } catch (IOException ex) {
        }

4
这很早,所以我可能会漏掉一些细节,但这和原帖有什么不同呢?他们需要在特定位置执行一个批处理文件。 - MadProgrammer

3
以下方法适用于我:
File dir = new File("E:\\test");
        ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "Start","test.bat");
        pb.directory(dir);
        Process p = pb.start();

2

您的代码没问题,但问题出在批处理文件中。

您需要显示批处理文件的内容, 您的问题在于批处理文件内的路径。


0
import java.lang.Runtime;

Process run = Runtime.getRuntime().exec("cmd.exe", "/c", "Start", "path of the bat file");

这对你来说很有效,并且易于使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接