Java在路径名中使用空格执行命令

Java在路径名中使用空格执行命令,java,Java,如何执行路径名中有空格的Java系统(shell)命令 我试过加引号和反斜杠(),但不起作用 ln -s "dir1/dir2" "my\ dir/dir2" 到目前为止,最可靠的方法是使用 如果使用,Java只在空白处拆分命令 使用由call new StringTokenizer(命令)创建的StringTokenizer将命令字符串分解为标记,而无需进一步修改字符类别。然后,标记器生成的标记按相同顺序放置在新的字符串数组cmdarray中 另见 或者使用类似的方法: ProcessBui

如何执行路径名中有空格的Java系统(shell)命令

我试过加引号和反斜杠(),但不起作用

ln -s "dir1/dir2" "my\ dir/dir2"

到目前为止,最可靠的方法是使用

如果使用,Java只在空白处拆分命令

使用由call new StringTokenizer(命令)创建的StringTokenizer将命令字符串分解为标记,而无需进一步修改字符类别。然后,标记器生成的标记按相同顺序放置在新的字符串数组cmdarray中

另见

或者使用类似的方法:

ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2");
Process p = pb.start();

您真的需要在shell中执行它吗(例如,您是否需要对
~
*
等内容进行shell扩展)?如果没有,您可以直接调用
ln

Process p =
    Runtime.getRuntime()
    .exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"});
如果您确实需要一个shell,请尝试以下方法(这可能需要根据shell处理引号的方式进行一些调整):

编辑:


我觉得第二条路径中有一个反斜杠。如果不应该从上面的字符串文本中删除
\\

这些都不适用于Lion。但是,以下方法确实有效,并且向后兼容Tiger

Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});

您可以按以下方式使用它,而无需引入任何反斜杠:
Runtime.getRuntime().exec(新字符串[]{“ln”,“-s”,“dir1/dir2”,“my dir/dir2”})

“my\dir/dir2”
在Java中不是有效的字符串,因为
“\”
不是有效的转义序列。请尝试
“my\\dir/dir2”
。不,这是我在字符串中打印时的输出。我已经在用“\\”啊,好的。这还不清楚。您是否有可能使用OSX?我很困惑-在第二条路径中是否有反斜杠和空格,或者只是一个空格(反斜杠的目的是“转义”空格)?ProcessBuilder是推荐的方法,因为它比Runtime处理空格的效果要好得多。exec()我实际上刚刚添加了一个基于Javadocs的使用ProcessBuilder的示例。你觉得合适吗?我试过用这个,但还是不行。我必须指定可执行文件的完整路径吗?您试试并告诉我们如何?:-)通过查看
p.waitFor()
p.exitValue()
返回的值,应该可以清楚地看到是否存在错误,如果存在错误,错误是什么。例如,如果退出值为127,则是,它找不到该命令,您应该尝试将其更改为
/bin/ls
getErrorStream
也将提供更多信息。我还要指出,这个答案(希望)避免了命令注入攻击。如果您的进程使用/bin/sh,您应该注意命令注入。
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});