0

ユーザーがcmdコマンドを実行できる単純なJavaアプリケーションを作成しています。コマンドを入力するための 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();
                }
            }
        });

ユーザーが実行すると、すべて正常に動作します

メモ帳.exe

しかし、コマンドが次のような場合、何らかの理由でjava.lang.IllegalArgumentExceptionが発生します。

"C:\Users\Username\AppData\Local\Google\Chrome\Application\chrome.exe" www.youtube.com

おそらく引用符が原因です。これに対する回避策を知っている人はいますか?

4

2 に答える 2

4

ProcessBuilderList<String>orとして渡された引数のリストが必要String...です。あなたの問題は、引用符で囲まれていないスペースがあるため、2 つの別々の引数を 1 つとして渡していることです。そのため、引用符で囲まれていないスペースでユーザー コマンドを分割する必要があります。これを行うには、使用できます

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);
}

私の場合、コンピューターでそのようなパスが見つからないというエラーのみが出力されますが、ユーザーコンピューターでは正常に動作するはずです。

于 2013-08-10T11:32:35.860 に答える