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类,因为它比运行时的
要使用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(); |