关于Java:Runtime.getRuntime().exec找不到它的物理目录路径

When Runtime.getRuntime().exec call linux batch file could not find its physical directory

本问题已经有最佳答案,请猛点这里访问。

我有一个Java应用程序。我使用RunTime.GeTrimeMe().Excel来调用一个批处理文件。当我用运行时调用Linux批处理文件时,GeRunTunMe()。Excel批处理文件找不到它自己的目录。我在批处理文件中使用pwd命令,但它返回应用程序路径。我需要批处理文件自身的物理路径。我该怎么做?


必须使用ProcessBuilder才能完成以下操作:

1
2
ProcessBuilder builder = new ProcessBuilder("pathToExecutable");
builder.directory( new File("..." ).getAbsoluteFile() ); //sets process builder working directory


批处理文件(如果您专门指扩展名为".bat"的文件)设计用于在Windows中与Microsoft的命令提示符shell("cmd.exe")一起使用,因为它们是包含专门用于此shell的一系列命令的脚本文件,因此不适用于UNIX shell(如bash)。

假设您实际上是指一个Unix"shell脚本",而不是特别指一个Microsoft"批处理文件",那么最好使用ProcessBuilder类,因为它比运行时的exec()方法提供了更大的灵活性。

要使用processbuilder在其自己的目录中运行脚本,请将builder目录设置为指向脚本所用的同一目录,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Point to wherever your script is stored, for example:
String script    ="/home/andy/bin/myscript.sh";
String directory = new File(script).getParent();

// Point to the shell that will run the script
String shell ="/bin/bash";

// Create a ProcessBuilder object
ProcessBuilder processBuilder = new ProcessBuilder(shell, script);

// Set the script to run in its own directory
processBuilder.directory(new File(directory));

// Run the script
Process process = processBuilder.start();


试试这个。这对我很有效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        Process p = Runtime.getRuntime().exec("pwd");
        BufferedReader bri = new BufferedReader
                (new InputStreamReader(p.getInputStream()));
        BufferedReader bre = new BufferedReader
                (new InputStreamReader(p.getErrorStream()));
        String line;
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
        bri.close();
        while ((line = bre.readLine()) != null) {
            System.out.println(line);
        }
        bre.close();
        p.waitFor();