使用Runtime.exec运行批处理文件而不使用cmd.exe

时间:2013-12-06 18:54:55

标签: java linux windows batch-file cmd

我正在运行一个执行脚本的Java应用程序。相关代码是

    String command [] = new String [2];
    command[0] =  "customSearch";
    command[1] =  query;    

    Process process = Runtime.getRuntime().exec(command);

此代码在Linux上运行,因为我在customSearch目录中放置了一个名为/usr/bin的脚本。以类似的方式,我在Windows中创建了一个名为customSearch.bat的批处理文件,并确保它位于PATH上。但是,这个Java代码在Windows上不起作用,因为“批处理文件本身不可执行”,因为this线程提到了。

为了让它在Windows上运行,我不得不说

    command[0] =  "cmd /c start customSearch";

但是,我不想这样做,因为这不适用于Linux。如何在不更改command[0]的情况下在Windows上运行批处理文件?

1 个答案:

答案 0 :(得分:4)

如果操作系统是Windows,您可以添加一个检查,然后执行custom-windows-batch-runner-snippet。

例如,我创建了一个简单的test.bat文件,其中包含netstat命令:

netstat

以下是我通过Java片段执行的方式:

String os = System.getProperty("os.name");
if (os.toLowerCase().indexOf("win") >= 0) {
    command = new String[1];
    command[0] = "test.bat";  

    Process process = Runtime.getRuntime().exec(command);
    BufferedReader is = new BufferedReader(
                            new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = is.readLine()) != null) {
       System.out.println(line);
    }
}

这是控制台中的结果:

D:\workspace\SO>netstat

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    127.0.0.1:19872        hp:49266               ESTABLISHED
  TCP    127.0.0.1:49169        hp:49170               ESTABLISHED
  TCP    127.0.0.1:49170        hp:49169               ESTABLISHED'
....

更好的是,您可以使用if语句包装每个特定于操作系统的命令执行代码段。