我正在为命令行应用程序做一个前端。它有一个很长的命令行是这样的:
public String liveShellCommand(){
String cmd="command mode --parameter arg --parameter2 arg2 --parameter3 arg3";
Runtime run = Runtime.getRuntime() ;
Process pr ;
try {
log.progress("sending command: " +cmd);
pr = run.exec( cmd );
pr.waitFor() ;
在我将“模式”开关添加到其中之前,一切似乎都有效。 “mode”开关从命令行执行。我尝试了一些组合将参数拆分成一个不执行的数组。我认为它与“模式”有关 - 没有 - 在它面前,它不能有 - 在它面前。
我做错了什么?
编辑:我忘了提到我能看到的就是:调试器停止在无法编译的源代码上。我正在使用netbeans,它似乎没有打印出堆栈跟踪。它在run.exec(cmd)上停止。 java有什么问题吗?
我能够使用ProcessBuilder来运行它,而不仅仅是失败......
它解析“命令”就好了,但是当我添加“命令模式”
时 java.io.IOException: Cannot run program "command mode": java.io.IOException: error=2, No such file or directory
所以它无法解析我猜。
答案 0 :(得分:6)
+1,用于通过数组发送参数。
以字符串形式发送所有内容可能对某些系统有效,但对其他系统无效。
Process start = Runtime.getRuntime().exec(new String[]
{ "java", "-version" });
BufferedReader r = new BufferedReader(
new InputStreamReader(start.getErrorStream()));
String line = null;
while ((line = r.readLine()) != null)
{
System.out.println(line);
}
我知道你已经说过你尝试通过一系列字符串发送参数但没有成功,但是你收到了不同类型的错误吗?如果其他程序有日志,您可能想看看出了什么问题。您可以编写一个简单的脚本,输出调用它的参数来测试实际发生的事情。
答案 1 :(得分:1)
使用ProcessBuilder并将其传递给String []
String[] cmmm = {arg3,arg4,arg5, arg6,arg7 };
ProcessBuilder pb = new ProcessBuilder(cmmm);
pb.directory(new File(tDir));
Process p = pb.start();
答案 2 :(得分:0)
一个数组就是答案。由于命令的复杂性,我还使用了ArrayList。无论如何......定义了arraylist,添加了命令,转换为数组,显示数组,发送命令..一切运作良好。每个参数必须在数组中自己的String中。
List<String> list = new ArrayList<>();
list.add("command");
list.add("param");
String[] command = (String[]) list.toArray(new String[0]);
log.progress (list);
run.exec (command);