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

我使用以下命令。

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

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

项目的DIR结构如下:

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

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

您可以使用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();

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

不适合我不知道为什么

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

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

当Java运行时,您使用RunTime.Excor()使用相对路径,相对于当前用户指向的相对手段,调用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");

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

运行时类中没有采用三个字符串参数的"exec"方法。

那是真的。我指的是字符串[]版本,但我不能在so文本框中输入方括号…我想我必须阅读手册/维基…

假设我有三个命令应该从cmd运行,然后将为每个命令打开三个单独的cmd窗口,是否有一种方法可以在一个cmd窗口上执行所有三个命令。

@viveksinghggits请阅读:stackoverflow.com/questions/8055371/…

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

File file = new File("server.bat");

Desktop.getDesktop().open(file);

对我来说真的很新鲜。

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

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

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

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

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
}