如何从java执行批处理文件?

时间:2009-09-14 12:05:12

标签: java batch-file

我想从java程序执行批处理文件。

我正在使用以下命令。

Runtime.getRuntime().exec("server.bat");

但问题是我想提供一个reative路径而不是绝对路径,以便我可以在任何comp上部署该java项目。

项目的目标结构如下:

com
   |
  project
   |
   ------ parser
   |         |_____ Main.java
   |
   -------util
             |_____ Server.bat

我想从“parser”目录中的“Main.java”文件中运行“util”目录中的“Server.bat”文件。

7 个答案:

答案 0 :(得分:8)

您可以使用ProcessBuilder。它提供了比exec更多的控制。特别是,它允许使用方法directory设置工作目录。

示例:

ProcessBuilder pb = new ProcessBuilder("server.bat");
pb.directory(new File(deployDir + "\\com\\project\\util"));
Process p = pb.start();
int exitStatus = p.waitFor();

当然,你的应用必须从某个地方获得deployDir。它可以在环境中设置,在应用程序配置文件中,可以是当前用户目录或其他任何内容。

答案 1 :(得分:6)

您必须使用参数“/ c”和“server.bat”运行“cmd.exe”:

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } );

答案 2 :(得分:5)

当Java运行并且您使用带有相对路径的Runtime.exec()时,相对意味着相对于调用JVM的当前用户目录。

这可能有用

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat");

如果从com的父目录启动java。

或者你必须计算一个绝对路径:

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat");

我忘记了,请阅读When Runtime.exec() won't

答案 3 :(得分:4)

如果支持,您可以使用Desktop(Java 1.6)

    File file = new File("server.bat");
    Desktop.getDesktop().open(file);

答案 4 :(得分:0)

Plexus utils提供了一个Commandline类型,可以调用任意命令行并处理输出的解析。

Commandline cl = new Commandline();

cl.setExecutable( "cmd.exe" );
cl.createArg().setValue( "/c" );

cl.setWorkingDirectory( new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat"));

cl.createArg().setValue( "/c" );

StreamConsumer consumer = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

StreamConsumer stderr = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

int exitCode;

try {
    exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() );
} catch ( CommandLineException ex ) {
    //handle exception
}

答案 5 :(得分:0)

最好的办法是将应用程序的安装目录存储在系统中,然后使用它在应用程序中构建路径。 System.getProperty(“user.dir”)应该可以在Windows和Unix平台上运行以获取当前的工作目录,但它依赖于系统,所以要注意这一点。

答案 6 :(得分:0)

exec的第二个参数是环境设置的args的String [](null表示继承进程的当前值),exec的第三个参数应该是提供工作目录的文件。试试这个:

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));