WLST Ant Task пробел в аргументах

Я использую задачу WLST Ant, которая позволяет передавать список аргументов, разделенных пробелами, в атрибуте arguments.

Проблема в том, что я передаю каталог файлов, который содержит пробел. Например, «Program Files», который становится двумя аргументами Program и Files.

Есть ли какие-либо предложения, чтобы обойти это?

Мое предложение ниже будет работать только с одним значением. Например, добавьте аргумент «Program Files» в конец и выполните цикл от известного конечного аргумента до фактического конца sys.argv. IE Если мы хотим, чтобы "Program Files" был 4-м системным аргументом, то внутри сценария WLST мы добавляем sys.argv[4],[5]...[end].


person IanWatson    schedule 24.03.2014    source источник
comment
вы пробовали давать: Program\Files?   -  person Mani    schedule 25.03.2014
comment
Только что попробовали, не повезло.   -  person IanWatson    schedule 25.03.2014
comment
Также пробовали космических персонажей. Проблема в том, что любой символ пробела интерпретируется как разделитель.   -  person IanWatson    schedule 25.03.2014


Ответы (1)


Краткий ответ для WLST 11.1.1.9.0: вы не можете обойти это.

У меня такая же проблема и немного отлажена.

Мои выводы: класс WLSTTask в weblogic-11.1.1.9.jar вызывает через командную строку WLSTInterpreterInvoker, которая анализирует аргументы:

private void parseArgs(String[] arg) {
    for (int i = 0; i < arg.length; i++) {
      this.arguments = (this.arguments + " " + arg[i]);
}
[...]

По неизвестным мне причинам эти аргументы снова анализируются перед вызовом скрипта python:

private void executePyScript() {
    [...]
    if (this.arguments != null) {
        String[] args = StringUtils.splitCompletely(this.arguments, " ");
    [...]


public static String[] splitCompletely(String paramString1, String paramString2)
{
    return splitCompletely(new StringTokenizer(paramString1, paramString2));
}

private static String[] splitCompletely(StringTokenizer paramStringTokenizer) {
    int i = paramStringTokenizer.countTokens();
    String[] arrayOfString = new String[i];

    for (int j = 0; j < i; j++) arrayOfString[j] = paramStringTokenizer.nextToken();
    return arrayOfString;
}

К сожалению, метод StringTokenizer не различает строки в кавычках, поэтому sys.argv в Python получает отдельные аргументы, даже если вы заключаете параметр в кавычки.

Есть две возможные альтернативы:

  • Замените пробелы в Ant чем-то другим (например, %20) и «декодируйте» их в Python.
  • Напишите файл свойств в Ant и прочитайте его в Pyhton.

Код для executePyScript() в 12.2.1 сильно изменился, и кажется, что проблема может исчезнуть там (я не проверял)

if ((this.arguments.indexOf("\"") == -1) && (this.arguments.indexOf("'") == -1))
  args = StringUtils.splitCompletely(this.arguments, " ");
else {
  args = splitQuotedString(this.arguments);
}
person Arigion    schedule 22.08.2016