从java更改命令的工作目录

changing the working-directory of command from java

我需要从Java项目中的一个包中执行一个函数来执行.exe文件。现在工作目录是Java项目的根目录,但是是我项目中子目录中的.exe文件。以下是项目的组织方式:

1
2
3
4
5
6
7
ROOT_DIR
|.......->com
|         |......->somepackage
|                 |.........->callerClass.java
|
|.......->resource
         |........->external.exe

最初我尝试直接通过以下方式运行.exe文件:

1
2
3
String command ="resources\\external.exe  -i input -o putpot";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

但问题是外部的.exe需要访问它自己目录中的一些文件,并一直认为根目录就是它的目录。我甚至尝试使用.bat文件来解决这个问题,但同样的问题出现了:

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

而.bat文件与.exe文件在同一目录中,但会发生相同的问题。以下是.bat文件的内容:

1
2
3
4
5
6
@echo off
echo starting process...

external.exe -i input -o output

pause

即使我将.bat文件移到根目录并修复其内容,问题也不会消失。PLZ PLZ PLZ帮助


要实现这一点,您可以使用processbuilder类,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
File pathToExecutable = new File("resources/external.exe" );
ProcessBuilder builder = new ProcessBuilder( pathToExecutable.getAbsolutePath(),"-i","input","-o","output");
builder.directory( new File("resources" ).getAbsoluteFile() ); // this is where you set the root folder for the executable to run with
builder.redirectErrorStream(true);
Process process =  builder.start();

Scanner s = new Scanner(process.getInputStream());
StringBuilder text = new StringBuilder();
while (s.hasNextLine()) {
  text.append(s.nextLine());
  text.append("
"
);
}
s.close();

int result = process.waitFor();

System.out.printf("Process exited with result %d and output %s%n", result, text );

这是相当多的代码,但它可以让您更好地控制进程的运行方式。


使用此形式的exec方法指定工作目录

1
2
3
4
public Process exec(String[] cmdarray,
                    String[] envp,
                    File dir)
             throws IOException

工作目录是第三个参数。如果您不需要设置任何特殊环境,您可以通过nullfor envp

还有一种方便的方法:

1
2
3
4
public Process exec(String command,
                    String[] envp,
                    File dir)
             throws IOException

…在一个字符串中指定命令(它只是为您转换成一个数组;有关详细信息,请参阅文档)。


我在我的项目中遇到了同样的问题,我尝试了这个关于ProcessBuilder.directory(myDir)Runtime的exec方法的解决方案,所有的信盒都失败了。< BR>这让我明白,Runtime仅对其工作目录和子目录具有有限的权限。< BR>< BR>所以我的解决方案很难看,但效果很好。< BR>我在工作目录的"运行时"中创建了一个临时.bat文件。< BR>此文件包含两行命令:
1。移动到所需目录(cd命令)。< BR>2。在需要时执行命令。< BR>我用临时的.bat文件作为命令调用Runtime的exec。< BR>这对我很有用!