我有一个程序,通过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;
}
答案 0 :(得分:0)
使用Apache Common CLI库。它可以很好地解析选项和参数。 http://commons.apache.org/proper/commons-cli/
答案 1 :(得分:0)
有许多“库外”的Java库可以帮助您进行命令行解析;有关示例,请参阅How to parse command line arguments in Java?。
但是,“智能地”解析命令参数取决于您来自哪里:
如果你想要根据一致的语法或元语法解析命令参数,那么其中一些例子肯定会这样做。
如果你想要一些神奇地理解用户真正含义的东西,那么你就是在梦想