如何从Java应用程序运行批处理文件?

如何从Java应用程序运行批处理文件?,java,batch-file,runtime.exec,Java,Batch File,Runtime.exec,在我的Java应用程序中,我想运行一个批处理文件,该批处理文件调用“scons-Q implicit deps changed build\file\u load\u type export\file\u load\u type” 似乎我甚至无法执行批处理文件。我没有主意了 这就是我在Java中所拥有的: Runtime. getRuntime(). exec("build.bat", null, new File(".")); 以前,我有一个Python Sconscript文件

在我的Java应用程序中,我想运行一个批处理文件,该批处理文件调用“
scons-Q implicit deps changed build\file\u load\u type export\file\u load\u type

似乎我甚至无法执行批处理文件。我没有主意了

这就是我在Java中所拥有的:

Runtime.
   getRuntime().
   exec("build.bat", null, new File("."));

以前,我有一个Python Sconscript文件,我想运行它,但由于它不起作用,我决定通过批处理文件调用该脚本,但该方法至今尚未成功

用于运行批处理脚本的可执行文件是
cmd.exe
,它使用
/c
标志指定要运行的批处理文件的名称:

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "build.bat"});
理论上,您也应该能够以这种方式运行SCON,尽管我还没有测试过:

Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build\file_load_type", "export\file_load_type"});

编辑:阿玛拉,你说这不管用。您列出的错误是在Windows设备上从Cygwin终端运行Java时出现的错误;这就是你在做的吗?问题是Windows和Cygwin有不同的路径,因此Windows版本的Java在Cygwin路径上找不到scons可执行文件。如果这是您的问题,我可以进一步解释。

批处理文件不是可执行文件。它们需要一个应用程序来运行它们(即cmd)

在UNIX上,脚本文件在文件的开头有shebang(#!)来指定执行它的程序。在Windows中双击由Windows资源管理器执行
CreateProcess
对此一无所知

Runtime.
   getRuntime().
   exec("cmd /c start \"\" build.bat");

注意:使用
start\“\”
命令,将打开一个单独的命令窗口,其中包含一个空白标题,并且将显示批处理文件的任何输出。它还应该只与`cmd/c build.bat一起使用“,在这种情况下,如果需要,可以从Java中的子进程读取输出。

是运行外部进程的Java 5/6方式。

有时线程执行进程时间高于JVM线程等待进程时间,通常在调用的进程需要一段时间才能处理时发生,请使用waitFor()命令如下:

Runtime runtime = Runtime.getRuntime();
try {
    Process p1 = runtime.exec("cmd /c start D:\\temp\\a.bat");
    InputStream is = p1.getInputStream();
    int i = 0;
    while( (i = is.read() ) != -1) {
        System.out.print((char)i);
    }
} catch(IOException ioException) {
    System.out.println(ioException.getMessage() );
}
try{    
    Process p = Runtime.getRuntime().exec("file location here, don't forget using / instead of \\ to make it interoperable");
    p.waitFor();

}catch( IOException ex ){
    //Validate the case the file can't be accesed (not enought permissions)

}catch( InterruptedException ex ){
    //Validate the case the process is being stopped by some external situation     

}

这样,JVM将停止运行,直到您调用的进程完成,然后再继续执行线程执行堆栈。

要使用java运行批处理文件,如果您正在谈论的是

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);`
这应该可以做到。

processp=Runtime.getRuntime().exec(
新字符串[]{“cmd”,“/C”,“orgreg.bat”},
无效的
新文件(“D://TEST//home//libs//”);
使用jdk1.5和jdk1.6进行测试

这对我来说很好,希望对其他人也有帮助。
为了得到这个,我奋斗了更多的日子(

以下各项工作正常:

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);

我也有同样的问题。但是有时CMD无法运行我的文件。 这就是为什么我在我的桌面上创建了一个temp.bat,下一个temp.bat将运行我的文件,下一个temp文件将被删除

我知道这是一个更大的代码,但是当Runtime.getRuntime().exec()失败时,它对我的工作效率为100%


此代码将执行路径C:/folders/folder中存在的两个command.bat

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");
要扩展,您只需执行以下操作即可获得所运行脚本的返回输出(事后不是实时):

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}

谢谢。它仍然不起作用-这段代码在我的应用程序中甚至没有执行。我将尝试您提供的另一个选项。再次感谢。当我尝试第二个选项时,它给出了以下错误:线程“main”java.io.IOException中的异常:无法运行程序“scons”:CreateProcess error=2,系统找不到指定的文件我没有Cygwin终端。我使用Windows命令终端。这很奇怪-我不知道为什么它不能工作。这完全让我困惑。为什么ProcessBuilder是Java 5/6的发展方向?恢复旧post的有趣选择…ProcessBuilder提供了更多的控制,指定能够轻松地将stderr重定向到stdout。我也发现设置更直观,但这是一个个人问题。这个问题已经用一个有效的解决方案得到了回答。你应该只提供你知道有效的解决方案,并描述为什么你认为你的解决方案可能更好。添加此==>BufferedReader=new BufferedReader(new InputStreamReader(p.getInputStream());String line=reader.readLine();while(line!=null){System.out.println(line);line=reader.readLine();}对我来说,它说Windows找不到“build.bat”。那么我应该把这个文件放在哪里?或者我应该如何给出路径。有什么建议吗?假设我有一个命令数组,然后迭代该数组以执行(I=0 to commands.length){Runtime.getRuntime().exec(“cmd/c start buil.bat”);}的所有命令,然后每次迭代(对于每个命令)一个命令窗口正在打开,这是显而易见的。我的意思是在一个窗口上执行所有的命令。我们有一些代码直接调用“gradlew.bat”,而不放“cmd/c”我猜Java或Windows在某种程度上解决了部分问题。如果我们尝试执行“gradlew”,那就失败了,所以很明显,最后仍然需要“.bat”。
Win+R
(运行时)可以直接执行批处理文件。对该代码进行注释并告诉我们InputStream读取的原因和内容以及我关心的原因将非常有用。此外,批处理文件的代码运行良好,但我无法让它引发错误异常。如果有“is”这样一个令人困惑的变量名,我会发疯的在我的代码中,/c是什么意思?请不要只发布代码作为答案,还要解释代码的作用以及它是如何解决问题的。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引更多的选票。
try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
import java.io.IOException;

public class TestBatch {

    public static void main(String[] args) {
        {
            try {
                String[] command = {"cmd.exe", "/C", "Start", "C:\\temp\\runtest.bat"};
                Process p =  Runtime.getRuntime().exec(command);           
            } catch (IOException ex) {
            }
        }

    }

}