经常讨论,但这似乎是一种奇怪的情况。
在win cmd.exe中,我成功运行:
"c:\Program Files\myapp.exe" -my_arg="sth. with space"
和"c:\Program Files\myapp.exe" -my_arg="sth_without_space"
在Java ProcessBuilder.command(xxx)中,以下操作失败,并且“c:\Program”不是有效命令(xxx包含以下数组):// using cmd.exe:
["cmd.exe", "/c", "c:\Program Files\myapp.exe", "-my_arg=sth. with space"] // no extra quoting
["cmd.exe", "/c", "\"c:\Program Files\myapp.exe\"", "-my_arg=sth. with space"] // exe quoted
["cmd.exe", "/c", "\"c:\Program Files\myapp.exe\"", "-my_arg=\"sth. with space\""] // exe & arg quoted
["cmd.exe", "/c", "c:\Program Files\myapp.exe", "-my_arg=\"sth. with space\""] // arg quoted
// putting all as cmd.exe arg:
["cmd.exe", "/c", "c:\Program Files\myapp.exe -my_arg=sth. with space"] // no extra quoting
["cmd.exe", "/c", "\"c:\Program Files\myapp.exe\" -my_arg=sth. with space"] // exe quoted
["cmd.exe", "/c", "\"c:\Program Files\myapp.exe\" -my_arg=\"sth. with space\""] // exe & arg quoted
["cmd.exe", "/c", "c:\Program Files\myapp.exe -my_arg=\"sth. with space\""] // arg quoted
// calling *.exe directly
["c:\Program Files\myapp.exe", "-my_arg=sth. with space"] // no extra quoting
["\"c:\Program Files\myapp.exe\"", "-my_arg=sth. with space"] // exe quoted
["\"c:\Program Files\myapp.exe\"", "-my_arg=\"sth. with space\""] // exe & arg quoted
["c:\Program Files\myapp.exe", "-my_arg=\"sth. with space\""] // arg quoted
运行此工作正常:["cmd.exe", "/c", "c:\Program Files\myapp.exe", "-my_arg=sth_without_space"]
当* .exe路径和arg包含空格时,问题似乎开始。[编辑]:
我的问题是:如何在exe的路径和arg的内容中使用空格运行它?
最佳答案
要使其与cmd和WITH空格一起使用,您需要添加另一层引用。
毕竟,您编写了一个Java程序。 Java编译器期望将字符串加引号,但在运行时这些引号不再存在。一些字符串将用于启动cmd,其他字符串将传递给cmd。
Cmd本身会检查接收到的参数并将对其进行解析。要标记哪个空格是定界符而哪个不是,您需要带引号。 Cmd将理解这些引号并将其删除-被调用的程序不再注意到它们。
因此,要么添加更多引号(使用正确的转义符),要么尝试直接运行可执行文件。
["cmd.exe", "/c", "\"c:\\Program Files\\myapp.exe\"", "\"-my_arg=sth_with space\""]
关于java - Windows空间中* .exe路径和参数中的java ProcessBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66045955/