从Java执行外部程序(使用cmd、Windows)

从Java执行外部程序(使用cmd、Windows),java,cmd,external,processbuilder,Java,Cmd,External,Processbuilder,我做过很多研究,通过一些简单的代码来执行外部程序(例如iTunes),但是这些建议从来都不起作用。有时什么也没发生,有时我会收到以下错误消息: 我的代码如下: try { String name = (String) "start " + table.getValueAt(table.getSelectedRow(), table.getSelectedColumn()); ProcessBuilder p = new ProcessBuilder("cmd.exe", "cd

我做过很多研究,通过一些简单的代码来执行外部程序(例如iTunes),但是这些建议从来都不起作用。有时什么也没发生,有时我会收到以下错误消息:

我的代码如下:

try {
    String name = (String) "start " + table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
    ProcessBuilder p = new ProcessBuilder("cmd.exe", "cd /D %HOMEDRIVE%%HOMEPATH%/Desktop", "/c", name);
    p.start();
} catch (Exception e) {
    e.printStackTrace();
}
在我的示例中,我从一个
JTable
获取外部程序的名称,这部分工作正常。ProcessBuilder将首先将目录更改为桌面。然后,外部程序应通过
start
命令执行。通过这段代码,我得到了上面提到的错误消息


如果您有使用cmd的解决方案,请包括将目录更改为桌面。

您应该将每个参数作为单个条目传递到
ProcessBuilder
。在您当前的代码中,有时会同时使用多个参数(如
cd/D%HOME…
)。尝试将每个参数作为自己的参数传递,包括启动命令及其参数:

String name = (String) table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
ProcessBuilder p = new ProcessBuilder("cmd.exe", "cd", "/D", "%HOMEDRIVE%%HOMEPATH%/Desktop", "/c", "start", name);
根据:

/D忽略注册表自动运行命令 HKLM | HKCU\Software\Microsoft\Command Processor\AutoRun

你是说
start.exe/D
不是
cmd.exe/D

他们还说

如果指定了/C或/K,那么命令行的其余部分将作为新shell中的立即命令处理。如果用引号括起来,则接受由命令分隔符“&”或“&&”分隔的多个命令


你是说
cmd.exe/C“cd%HOMEDRIVE%%HOMEPATH%\Desktop&Discord”

有关设置工作目录的更好方法,请参阅。如果不工作,则会出现相同的错误消息。