运行 使用 java 程序和参数的 shell 脚本

Run a shell script using java program along with parameters

我正在尝试从我的 java 应用程序 运行 一个 shell 脚本,但无法将我的脚本所需的上下文参数传递给 运行 .

下面是当我在 cmd 上直接调用文件时有效的命令

MytestFile.sh --context_param db_host="localhost" --context_param db_name="test_db" --context_param data_api="https://test-api-dev-view.cloud.my.com/meta-info" --context_param api_body_path="C:\MyTest\4009\New\postRequestSmart.txt" --context_param service_customer="me" --context_param service_url="https://test-view.cloud.my.com/" --context_param file_path="C:\Test\4009\New\fileloc" --context_param processedDirectory="C:\Test\4009\New\PD"

现在我尝试使用 java 运行时调用相同的方法,并且我将上下文参数作为 strArray

传递

已更新:

public class App2 {

    public static void main(String[] args) throws IOException, InterruptedException {
        String[] strArray = new String[]{ "--context_param db_host=localhost"
                , "--context_param db_name=test_db"
                , "--context_param data_api=https://test-api-dev-view.cloud.my.com/meta-info"
                , "--context_param api_body_path=C:\MyTest\4009\New\postRequestSmart.txt"
                , "--context_param service_customer=me"
                , "--context_param service_url=https://https://test-view.cloud.my.com/"
                , "--context_param file_path=C:\Test\4009\New\fileloc"
                , "--context_param processedDirectory=C:\Test\4009\New\PD"}

              try { 
                 Runtime.getRuntime().exec("cmd /c start MytestFile.sh", strArray); 
              } catch (IOException e) { 
                 e.printStackTrace(); 
              }

    }

}

方法 2:使用流程构建器

package com.test.shell;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;


public class App2 {

    public static void main(String[] args) throws IOException, InterruptedException {
        

        String[] strArray = new String[]{ "--context_param db_host=localhost"
                , "--context_param db_name=test_db"
                , "--context_param data_api=https://test-api-dev-view.cloud.my.com/meta-info"
                , "--context_param api_body_path=C:\MyTest\4009\New\postRequestSmart.txt"
                , "--context_param service_customer=me"
                , "--context_param service_url=https://https://test-view.cloud.my.com/"
                , "--context_param file_path=C:\Test\4009\New\fileloc"
                , "--context_param processedDirectory=C:\Test\4009\New\PD"}
        

        ProcessBuilder pb = new ProcessBuilder(
                "MytestFile.bat");
        Process p = pb.start();

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String output;
        while ((output = stdInput.readLine()) != null) {
            System.out.println(output);
        }
    }

}

这正在调用我的 batch/sh 文件,但有人可以帮助解决如何将参数传递到此 ProcessBuilder 中吗?

我觉得我没有正确传递参数。

请让我知道我需要更正的地方。

TIA

您应该在一个数组中的命令后传递参数,并在空格处将参数拆分为各个参数:

    String[] cmd = new String[]{ 
        "MytestFile.bat"
            , "--context_param"
            , "db_host=localhost"
            ...
            , "--context_param"
            , "file_path=C:\Test\4009\New\fileloc"
            , "--context_param"
            ,"processedDirectory=C:\Test\4009\New\PD"}
    

    ProcessBuilder pb = new ProcessBuilder(cmd);

它在您的第一个示例中作为 Runtime.exec(String,String[]) 方法不起作用,第二个参数是环境 而不是 脚本参数。