execCMD(“cd~/Desktop/Tmp/Server/”java-javaagent:lib/Agent.jar-cp./Dachuang/Dachuang.jar:testcase test.Bank“);
为什么我在控制台上得到空结果?我的意思是,也许我不能在一些复杂的命令上正确地执行这个方法。我可以执行(“java--version”)等一些简单的命令。我不知道如何将参数传递给这个方法,我的命令是[cd~/Desktop/Tmp/Server/]和[java-javaagent:lib/Agent.jar-cp./Dachuang/Dachuang.jar:testcase test.Bank] 以下是我的截图:execCMD(“cd~/Desktop/Tmp/Server/”java-javaagent:lib/Agent.jar-cp./Dachuang/Dachuang.jar:testcase test.Bank“);,java,exec,Java,Exec,为什么我在控制台上得到空结果?我的意思是,也许我不能在一些复杂的命令上正确地执行这个方法。我可以执行(“java--version”)等一些简单的命令。我不知道如何将参数传递给这个方法,我的命令是[cd~/Desktop/Tmp/Server/]和[java-javaagent:lib/Agent.jar-cp./Dachuang/Dachuang.jar:testcase test.Bank] 以下是我的截图: Java不是外壳。你可以用。不要使用cd。和System.getProperty(
Java不是外壳。你可以用。不要使用
cd
。和System.getProperty(“user.home”)
而不是~
。差不多
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test{
public static void execCMD(String cmd){
StringBuilder result = new StringBuilder();
try {
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader bf = new BufferedReader(new
InputStreamReader(p.getInputStream()));
String line = null;
while((line= bf.readLine())!=null) {
result.append(line+"\n");
}
}catch(Exception e) {
result.delete(0,result.length()-1).append("无效命令");
};
System.out.println(result.toString());
}
public static void main(String[] args) throws IOException {
execCMD("cd ~/Desktop/Tmp/Server/ && java -javaagent:lib/Agent.jar -cp ./Dachuang/dachuang.jar:testcase test.Bank");
}
}
Java不是外壳。你可以用。不要使用
cd
。和System.getProperty(“user.home”)
而不是~
。差不多
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test{
public static void execCMD(String cmd){
StringBuilder result = new StringBuilder();
try {
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader bf = new BufferedReader(new
InputStreamReader(p.getInputStream()));
String line = null;
while((line= bf.readLine())!=null) {
result.append(line+"\n");
}
}catch(Exception e) {
result.delete(0,result.length()-1).append("无效命令");
};
System.out.println(result.toString());
}
public static void main(String[] args) throws IOException {
execCMD("cd ~/Desktop/Tmp/Server/ && java -javaagent:lib/Agent.jar -cp ./Dachuang/dachuang.jar:testcase test.Bank");
}
}
正如Elliott所说:Java不是外壳。而且它不理解shell命令语法。当您
exec
(或类似)一个包含空格的字符串时,Java会将其粗略地拆分为一个字符串数组,忽略任何shell转义或引号。然后调用exec(String[])
,它将第一个单词作为命令名,其余的作为命令的参数
如果确实要使用shell命令语法(例如&&
)和shell内置命令(例如cd
),可以执行以下操作:
public static void main(String[] args) throws IOException, InterruptedException {
File f = new File(System.getProperty("user.home"), "Desktop/Tmp/Server/");
ProcessBuilder pb = new ProcessBuilder().directory(f);
pb.inheritIO();
pb.command("java", "-javaagent:lib/Agent.jar",
"-cp", "./Dachuang/dachuang.jar:testcase", "test.Bank");
Process p = pb.start();
p.waitFor();
}
这实际上是运行bash
的实例来运行shell命令行。它应该适用于任何命令行。(您需要对命令字符串中的任何反斜杠或双引号字符使用普通Java字符串转义。这是因为这是Java字符串文字…)
对于您的示例,Elliott的答案是一个更优雅的解决方案,但是如果shell命令行更复杂,那么这种方法就太难了。正如Elliott所说:Java不是shell。而且它不理解shell命令语法。当您
exec
(或类似)一个包含空格的字符串时,Java会将其粗略地拆分为一个字符串数组,忽略任何shell转义或引号。然后调用exec(String[])
,它将第一个单词作为命令名,其余的作为命令的参数
如果确实要使用shell命令语法(例如&&
)和shell内置命令(例如cd
),可以执行以下操作:
public static void main(String[] args) throws IOException, InterruptedException {
File f = new File(System.getProperty("user.home"), "Desktop/Tmp/Server/");
ProcessBuilder pb = new ProcessBuilder().directory(f);
pb.inheritIO();
pb.command("java", "-javaagent:lib/Agent.jar",
"-cp", "./Dachuang/dachuang.jar:testcase", "test.Bank");
Process p = pb.start();
p.waitFor();
}
这实际上是运行bash
的实例来运行shell命令行。它应该适用于任何命令行。(您需要对命令字符串中的任何反斜杠或双引号字符使用普通Java字符串转义。这是因为这是Java字符串文字…)
对于您的示例,Elliott的答案是一个更优雅的解决方案,但是如果shell命令行更复杂,那么这种方法就太难了。使用。不要使用
cd
。和System.getProperty(“user.home”)
而不是~
。祝你好运你能告诉我密码吗?对不起,我是新手。使用。不要使用cd
。和System.getProperty(“user.home”)
而不是~
。祝你好运你能告诉我密码吗?对不起,我是新手。