Java Runtime.getRuntime (). Exec не работает с двойными кавычками в команде - PullRequest
0 голосов
/ 15 ноября 2018

Следующие команды отлично работают в моем терминале:

gcloud запись чтения "logName=projects/logs/java.log AND labels.component=projet1 AND textPayload=\"End: of query.\"

Но возвращает ноль inputstream при выполнении через Runtime.getRuntime().exec

Runtime rt = Runtime.getRuntime();
Process process = rt.exec(new String[]{"gcloud", "logging" ,"read" ,"logName=projects/logs/java.log AND labels.component=project1 AND textPayload=\"End: of query.\""});
BufferedReader is = new BufferedReader(new 
InputStreamReader(process.getInputStream()));

UPDATE: Я попытался использовать processBuilder, и мои аргументы команды выглядят так:

Команда: [gcloud, logging, read, 'logName = projects / logs / java.log AND tags.component = project1 AND textPayload = "Конец: запроса." И отметка времени> "2018-11-15T15: 12: 11Z" ']

Но я получаю следующую ошибку при выполнении:

ОШИБКА: (gcloud.logging.read) INVALID_ARGUMENT: Неразборчивый фильтр: синтаксическая ошибка в строке 1, столбце 147, токен "" 2018-11-15T15: 12: 11Z "'

1 Ответ

0 голосов
/ 15 ноября 2018

Вам нужно двойное \ экранирование, это обычное явление в Java, когда мы вызываем другую вещь, которая требует экранирования (регулярное выражение или что-то еще)

попробуйте это (я только заменил \ "на \\")

Runtime rt = Runtime.getRuntime();
Process process = rt.exec(new String[]{"gcloud", "logging" ,"read"  
,"logName=projects/logs/java.log AND labels.component=project1 AND textPayload=\\\"End: of query.\\\""});
BufferedReader is = new BufferedReader(new 
InputStreamReader(process.getInputStream()));
  • \: побег к \

  • \ ": побег к"

  • , поэтому \\ "сбежит вruntime.exec в \ "
...