使用Java中的ProcessBuilder执行命令时出现IllegalArgumentException

时间:2013-08-10 11:14:58

标签: java processbuilder illegalargumentexception

我正在编写一个简单的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

可能是因为引号,是否有人知道解决方法?

2 个答案:

答案 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("\"", "");

缺点是你可能会遇到更复杂的情况,很难弄清楚要修剪的内容。