从java运行shell脚本并捕获返回值

ukxgm1gy  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(597)

我正在尝试从java运行shell脚本,并希望在java中捕获shell脚本的退出值。下面是我尝试过的代码及其输出
java代码1:

try {

    ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "dir //pathOfSHFile//Test.sh");
                Process proc = processBuilder.start();
                proc.waitFor();
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                String line = "";
                String output = "";
                while ((line = in.readLine()) != null)
                {
                 output += line;
                } 
                System.out.println("### " + output);
            } catch (Throwable t) {
                t.printStackTrace();
            }

test.sh文件


# !/bin/sh

echo "good"

输出1:


### Volume in drive C is OSDisk Volume Serial Number is***Directory of C:\Data\Code07-12-2020  12:10                22 Test.sh

期望“好”作为输出。
java代码2:

try {
            Runtime rt = Runtime.getRuntime();
            Process pr = rt.exec(new String[]{"C:\\Data\\Code", ".\\Test.sh"});

            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            String line = "";
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

输出2:

java.io.IOException: Cannot run program "C:\Data\Code": CreateProcess error=5, Access is denied
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:621)
    at java.lang.Runtime.exec(Runtime.java:486)
    at Intersecttion.main(Intersecttion.java:53)
Caused by: java.io.IOException: CreateProcess error=5, Access is denied
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:444)
    at java.lang.ProcessImpl.start(ProcessImpl.java:140)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 3 more

我试图给所有的文件夹权限,但仍然是相同的结果。我需要传递一个参数以及脚本,但不知道如何得到这一点,并运行脚本以及获得退出值。除了上述方法,还有没有更好的方法呢。

qhhrdooz

qhhrdooz1#

版本2尝试执行文件夹。这应该起作用:

String path = "C:\\Data\\Code";
        String command = path + "\\Test.bat"; // Test.sh renamed
//      String command = "bash Test.sh"; // bash execution when installed on Windows

        Runtime rt = Runtime.getRuntime();

        Process pr = rt.exec(command, null, new File(path));

        BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        String line = "";
        while ((line = input.readLine()) != null) {
            System.out.println(line);
        }

但是,您可能必须将脚本改为批处理文件“test.bat”,因为windows不会以本机方式执行shell脚本。您还可以安装bash并执行 bash 以脚本作为参数的命令。我加了这句话作为评论。

相关问题