我正在编写一个简单的Java应用程序,用户可以在其中执行cmd命令。只有一个TextField可以输入命令,还有一个按钮来执行它。代码如下:
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", message.getText());
Process pr = pb.start();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
如果用户执行
,一切正常Notepad.exe的
但出于某种原因,如果命令是例如我得到 java.lang.IllegalArgumentException :
“C:\ Users \用户名\应用程序数据\本地\谷歌\铬\应用\的chrome.exe” www.youtube.com
可能是因为引号,是否有人知道解决方法?
答案 0 :(得分:3)
ProcessBuilder
期望传递的参数列表为List<String>
或String...
。您的问题是您将两个单独的参数作为一个传递,因为它们的空格不在引号中。因此,您需要在未放在引号中的空格上拆分用户命令。为此,您可以使用
Pattern p = Pattern.compile("\"[^\"]+\"|\\S+");
//pattern will find strings between quotes or separate words
Matcher m = p.matcher(userCmd);
while (m.find()) {
System.out.println("adding " + m.group());//just for debugging
list.add(m.group());
}
就像在这个例子中一样
String userCmd="\"C:\\Users\\Username\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe\""
+" www.youtube.com";
List<String> list=new ArrayList<>();
list.add("cmd.exe");
list.add("/c");
Pattern p = Pattern.compile("\"[^\"]+\"|\\S+");
Matcher m = p.matcher(userCmd);
while (m.find()) {
System.out.println("adding " + m.group());
list.add(m.group());
}
ProcessBuilder pb = new ProcessBuilder(list);
Process pr = pb.start();
InputStream err=pr.getErrorStream();
BufferedReader errReader=new BufferedReader(new InputStreamReader(err));
String line=null;
while((line=errReader.readLine())!=null){
System.out.println(line);
}
在我的情况下,只打印关于在我的计算机上找不到这样的路径的错误,但在用户计算机上应该可以正常工作。
答案 1 :(得分:0)
好了,因为您要求解决方法,您可以尝试在构建器运行之前修剪整个字符串中的引号:message.getText().replaceAll("\"", "");
。
缺点是你可能会遇到更复杂的情况,很难弄清楚要修剪的内容。