1

Runtime.getRuntime().exec(cmdArray[]) を介してコマンドが実行されるプログラムがあります。ユーザーは、これらのコマンドをテキストボックスに入力することで、これらのコマンドに追加のスイッチを追加できます。

例:

cmdArray[] = {"someprogram", "--something", "123"} //this is the initial command
//textbox is   -A "bla bla bla"   notice the quotes

//do something...

cmdArray[] = {"someprogram", "--something", "123", "-A", "bla bla bla"} //parsed array

これを可能にするJava関数はありますか? それとも自分で書かなければなりませんか (一重引用符と二重引用符、すべてのエスケープなどを処理する必要があるため、面倒に聞こえます...)?

ありがとう

編集:余分な依存関係が欲しくなかったので、簡単な方法を書きました。すべてをカバーするわけではありませんが、私が望むことを行います

public String[] getCmdArray(String cmd) { // Parses a regular command line and returns it as a string array for use with Runtime.exec()
    ArrayList<String> cmdArray = new ArrayList<String>();
    StringBuffer argBuffer = new StringBuffer();
    char[] quotes = {'"', '\''};
    char currentChar = 0, protect = '\\', separate = ' ';
    int cursor = 0;
    cmd = cmd.trim();
    while(cursor < cmd.length()) {
        currentChar = cmd.charAt(cursor);

        // Handle protected characters
        if(currentChar == protect) {
            if(cursor + 1 < cmd.length()) {
                char protectedChar = cmd.charAt(cursor + 1);
                argBuffer.append(protectedChar);
                cursor += 2;
            }
            else
                return null; // Unprotected \ at end of cmd
        }

        // Handle quoted args
        else if(inArray(currentChar, quotes)) {
            int nextQuote = cmd.indexOf(currentChar, cursor + 1);
            if(nextQuote != -1) {
                cmdArray.add(cmd.substring(cursor + 1, nextQuote));
                cursor = nextQuote + 1;
            }
            else
                return null; // Unprotected, unclosed quote
        }

        // Handle separator
        else if(currentChar == separate) {
            if(argBuffer.length() != 0)
                cmdArray.add(argBuffer.toString());
            argBuffer.setLength(0);
            cursor++;
        }

        else {
            argBuffer.append(currentChar);
            cursor++;
        }
    }

    if(currentChar != 0) // Handle the last argument (doesn't have a space after it)
        cmdArray.add(argBuffer.toString());

    return cmdArray.toArray(new String[cmdArray.size()]);
}

public boolean inArray(char needle, char[] stack) {
    for(char c : stack)
        if(needle == c)
            return true;
    return false;
}
4

2 に答える 2

0

コマンド ラインの解析に役立つ Java ライブラリが「世の中に」多数あります。Java でコマンドライン引数を解析する方法を参照してください。例えば。

ただし、コマンド引数を「インテリジェントに」解析することは、どこから来たのかによって異なります。

  • 一貫した構文またはメタ構文に従ってコマンド引数を解析するものが必要な場合は、これらの例のいくつかで確実にそれが行われます。

  • ユーザーが本当に意味することを魔法のように理解する何かが欲しいなら、あなたは夢を見ています

于 2013-08-23T13:53:56.027 に答える
0

Apache 共通 CLI ライブラリを使用します。オプションと引数を非常にうまく解析できます。 http://commons.apache.org/proper/commons-cli/

于 2013-08-23T13:51:08.230 に答える