Java Runtime exec()无法正确转义字符

这可能之前已经被回答过了,但是那是关于unicode的,我不认为这是unicode(它是ASCII的。。。)。

当我在终端中执行此操作时,没有任何问题

vboxmanage setextradata "Test Machine" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" 2222

但是当我在Java中使用以下内容时

Runtime.getRuntime().exec("vboxmanage setextradata \"Test Machine\" \"VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort\" 2222");

它返回错误:未注册的vm’“ TestMachine”’

对于其中带有空格的参数(例如Test \ Machine),也是如此,然后它不会转义空格。

现在我认为这与字符编码有关,但是我看不到设置该o_O的任何选项

回答:

您正在一次调用该程序及其参数,这有效地将整个字符串推入了处理环境(希望达到最佳效果)。

在Windows系统中,操作系统着重于以不同的方式处理可执行文件和参数,并将它们全部放在同一字符串中只是要求您选择环境(我知道其中有两个)可以重新使用的理想字符串。

-parse进入参数列表。更好的解决方案是使用

Runtime.exec(new String[] {"vboxmanage", "setextradata", "Test Machine", "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort", "2222"});

对应于 Runtime's

public Process exec(String[] cmdarray)

throws IOException

充其量,使用一个字符串方法,您最终将找到如何提示和转义参数,以免将它们视为可执行文件名称的一部分,但是随后您将遇到一个新问题,即它们被传递了。全部作为可执行文件的一个参数。一旦根据环境修复了该问题,您要么会发现自己的引号没有从参数中剥离(导致出现诸如“

2222”之类的参数),要么发现Window的半连续参数解析将首先在空白处进行解析(导致出现诸如(“

Test)之类的参数。这没有意义,这就是为什么有不止一种exec方法可用的原因。

以上是 Java Runtime exec()无法正确转义字符 的全部内容, 来源链接: utcz.com/qa/406657.html

回到顶部