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

How to execute a batch file from java?

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

我使用以下命令。

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

但问题是,我想给出一个替代路径,而不是绝对路径,以便在任何COMP上部署Java项目。

项目的DIR结构如下:

1
2
3
4
5
6
7
8
9
com
   |
  project
   |
   ------ parser
   |         |_____ Main.java
   |
   -------util
             |_____ Server.bat

我想从"分析器"DIR中的"Mudi.java"文件中运行"UTIL"DIR文件中的"Server .BAT"文件。


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

例子:

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

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


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

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


当Java运行时,您使用RunTime.Excor()使用相对路径,相对于当前用户指向的相对手段,调用JVM。

这可能起作用

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

如果从COM的父目录启动Java。

或者必须计算绝对路径:

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

我忘记了,当runtime.exec()不需要时读取。


如果支持的话,可以用桌面试试它(Java 1.6)

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


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

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

最好是将应用程序的安装目录存储在系统上,然后使用该目录在应用程序中构建路径。system.getproperty("user.dir")应该在Windows和Unix平台上工作以获取当前的工作目录,但它依赖于系统,因此请注意这一点。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
}