我想从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
}