从Java代码运行批处理文件

Ric*_*do 8 java batch-file

我试图从我的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) {
    }
Run Code Online (Sandbox Code Playgroud)

结果是程序在运行程序的根目录中打开一个cmd窗口,并且不访问我提供的文件路径.

rob*_*rob 30

而不是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"));
Run Code Online (Sandbox Code Playgroud)

但就个人而言,我会使用ProcessBuilder,这比使用和调试更加冗长但更容易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();
Run Code Online (Sandbox Code Playgroud)

  • @SaurabhBhoomkar肯定,只需用*/k*替换*/c*即可.请注意,如果您的进程将大量信息写入STDOUT或STDERR,则需要使用这些流.您可以启动读取进程'控制台流的线程,并将该输出写入Java程序的控制台和/或日志文件.如果您不使用流,则当缓冲区填满时,进程可能会阻塞并显示为挂起. (2认同)

dev*_*v2d 6

尝试下面

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

  • 这是早期的,所以我可能会遗漏一些东西,但这与OP的做法有何不同?他们需要在特定位置执行批处理文件 (4认同)