如何在Process.exec()中转义引号?

时间:2019-05-06 14:26:13

标签: java

我知道。关于它有几个问题,您将说我必须使用ProcessBuilder并传递String []作为参数。但是我确实需要将带引号的字符串传递给exec()。

            List<String> args = new ArrayList<String>();
            args.add( "ogr2ogr" );                  
            args.add( "-append" );                  
            args.add( "-update" );                  
            args.add( "-f" );
            args.add( "PostgreSQL" );
            args.add( "PG:\"host='odisseu-db' user='postgres' dbname='odisseu' password='guesswhat' port='5432'\"" );   
            args.add( file.getName() );
            args.add( "-nlt" );                             
            args.add( "GEOMETRY" );                             
            Process process = new ProcessBuilder( args ).start();

如您所见,PG参数后必须带有引号的字符串。我收到一个错误,例如:“你笨!我无法连接到user ='postgres'数据集!”。我确定ogr2ogr认为我没有引用该参数。

如何转义此参数?

编辑按索引更新参数。还是同样的问题。

1 个答案:

答案 0 :(得分:1)

这是问题所在。 Windows Process的Windows实现中对引号的处理有些奇怪。

它看到的任何双引号字符都将被删除。如果希望双引号通过,则必须使用反斜杠将其转义。并且由于您使用的是Java String文字,因此也需要转义反斜杠。

所以...将字符串更改为此:

"PG:\\\"host='odisseu-db' user='postgres' dbname='odisseu' password='guesswhat' port='5432'\\\""

参考:https://bugs.openjdk.java.net/browse/JDK-8131908

但请注意评论者的最终评论:

  

“报告的行为似乎与此文档https://msdn.microsoft.com/en-us/library/17w5ykft.aspx相符,该文档描述了Windows中如何处理引号。

     

将其关闭为“不是问题”。


对于Linux上的Java,参数字符串中的所有字符都将转换为OS默认字符集,然后直接传递给命令。单引号或双引号字符没有特殊含义。