Java中运行.exe程序并传递URL参数的问题求助
嘿,这俩问题都是ProcessBuilder在Windows下的常见坑,我帮你一步步解决!
问题1:路径空格导致的命令识别错误
你原来的代码用了cmd.exe /c间接调用EXE,但这里的核心问题是:当把带空格的路径拆成数组元素时,cmd会把空格当成参数分隔符,把C:/Program Files/eMailer/myProg.exe拆成了C:/Program和Files/eMailer/myProg.exe,自然就报错找不到命令了。
最优解决方案:直接调用EXE,不要通过cmd中转
ProcessBuilder本身就支持处理带空格的路径,不需要额外加引号,把EXE路径作为数组第一个元素,参数依次往后放就行:
// 直接指定EXE路径,ProcessBuilder会自动处理空格 String[] command = { "C:/Program Files/eMailer/myProg.exe", "C:\\Program Files\\eMailer\\params.txt" }; ProcessBuilder builder = new ProcessBuilder(command); builder.redirectErrorStream(true); Process p = builder.start();
如果确实需要通过cmd.exe /c执行(比如要运行批处理脚本),那得把整个命令打包成一个字符串作为/c的参数,并且给带空格的路径加双引号:
String[] command = { "cmd.exe", "/c", "\"C:/Program Files/eMailer/myProg.exe\" \"C:\\Program Files\\eMailer\\params.txt\"" };
不过这种写法容易出错,优先推荐直接调用EXE的方式。
问题2:传递URL参数失败
这个问题本质上和空格问题是一样的——只要用对了ProcessBuilder的参数传递方式,URL作为单独的数组元素就能完整传递。
比如要传递https://example.com/test?param=123作为参数,直接写:
String targetUrl = "https://example.com/test?param=123"; String[] command = { "C:/Program Files/eMailer/myProg.exe", targetUrl }; ProcessBuilder builder = new ProcessBuilder(command); builder.redirectErrorStream(true); Process p = builder.start();
关键是不要把URL拆成多个元素,也不需要手动转义特殊字符,ProcessBuilder会把整个URL作为一个完整的参数传递给你的EXE。如果之前传递失败,大概率是因为用了cmd.exe /c导致参数被错误拆分了。
验证小技巧
如果还是不确定参数是否正确传递,可以在你的myProg.exe里加一段代码打印所有接收到的命令行参数:
- 如果是Java写的EXE,直接打印
args数组 - 如果是C#写的,用
Environment.GetCommandLineArgs()
这样就能直观看到参数是不是完整的了。
内容的提问来源于stack exchange,提问作者wassim ben

