运行 使用 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[])
方法不起作用,第二个参数是环境 而不是 脚本参数。
我正在尝试从我的 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[])
方法不起作用,第二个参数是环境 而不是 脚本参数。