首页 > 解决方案 > Java Runtime.getRuntime().exec 不能在命令中使用双引号

问题描述

以下命令在我的终端中运行良好:

gcloud日志读取"logName=projects/logs/java.log AND labels.component=projet1 AND textPayload=\"End: of query.\"

inputstream但是在执行时返回 nullRuntime.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()));

更新: 我尝试使用 processBuilder,我的命令参数看起来像:

命令是:[gcloud, logging, read, 'logName=projects/logs/java.log AND labels.component=project1 AND textPayload="End: of query." AND 时间戳>"2018-11-15T15:12:11Z"']

但我在执行时收到以下错误:

错误:(gcloud.logging.read)INVALID_ARGUMENT:无法解析的过滤器:第 1 行第 147 列的语法错误,标记“2018-11-15T15:12:11Z”

标签: javagcloudruntime.execgoogle-cloud-dataproc

解决方案


你需要一个双 \ 转义,当我们调用另一个需要转义的东西(正则表达式或其他)时,这在 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 中转义为 \"

推荐阅读