java ProcessBuilder在Windows中的*.exe路径和参数中的空格



经常被讨论,但这似乎是一个奇怪的边缘情况。

在win cmd.exe中成功运行:

"c:Program Filesmyapp.exe" -my_arg="sth. with space"

"c:Program Filesmyapp.exe" -my_arg="sth_without_space"

在java ProcessBuilder.command(xxx)中出现"c:Program"不是有效的命令(xxx包含以下数组):

// using cmd.exe:
["cmd.exe", "/c", "c:Program Filesmyapp.exe", "-my_arg=sth. with space"]         // no extra quoting
["cmd.exe", "/c", ""c:Program Filesmyapp.exe"", "-my_arg=sth. with space"]     // exe       quoted
["cmd.exe", "/c", ""c:Program Filesmyapp.exe"", "-my_arg="sth. with space""] // exe & arg quoted
["cmd.exe", "/c", "c:Program Filesmyapp.exe", "-my_arg="sth. with space""]     //       arg quoted
// putting all as cmd.exe arg:
["cmd.exe", "/c", "c:Program Filesmyapp.exe -my_arg=sth. with space"]            // no extra quoting
["cmd.exe", "/c", ""c:Program Filesmyapp.exe" -my_arg=sth. with space"]        // exe       quoted
["cmd.exe", "/c", ""c:Program Filesmyapp.exe" -my_arg="sth. with space""]    // exe & arg quoted
["cmd.exe", "/c", "c:Program Filesmyapp.exe -my_arg="sth. with space""]        //       arg quoted
// calling *.exe directly
["c:Program Filesmyapp.exe", "-my_arg=sth. with space"]                          // no extra quoting
[""c:Program Filesmyapp.exe"", "-my_arg=sth. with space"]                      // exe       quoted
[""c:Program Filesmyapp.exe"", "-my_arg="sth. with space""]                  // exe & arg quoted
["c:Program Filesmyapp.exe", "-my_arg="sth. with space""]                      //       arg quoted

运行这个就可以了:

["cmd.exe", "/c", "c:Program Filesmyapp.exe", "-my_arg=sth_without_space"]

当*.exe路径和arg包含空格时,问题似乎开始了。

[编辑]:我的问题是:你怎么能运行它与空白在exe的路径和在arg的内容?

要使它与cmd和空格一起工作,您需要添加另一层引号。

毕竟你写了一个java程序。java编译器期望字符串被加引号,但是在运行时这些引号不再存在。其中一些字符串将用于启动cmd,其他字符串将传递给cmd。

Cmd本身检查它收到的参数并解析它们。要标记哪些空白是分隔符,哪些不是,您需要使用引号。Cmd将理解这些引号并删除它们-被调用的程序不再注意到它们。

所以要么添加更多的引号(用正确的转义),要么尝试直接运行可执行文件。

["cmd.exe", "/c", ""c:\Program Files\myapp.exe"", ""-my_arg=sth_with space""]

最新更新