我知道。关于它有几个问题,您将说我必须使用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
认为我没有引用该参数。
如何转义此参数?
编辑按索引更新参数。还是同样的问题。
答案 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默认字符集,然后直接传递给命令。单引号或双引号字符没有特殊含义。