4

我想使用 Runtime.exec() 在带有空格的目录中启动另一个进程。(听起来很蠢,但我真的很想满足我的好奇心)

问题详情(简化版) 我有一个 myprogram.exe,位于 C:/Program Files/MyProgram。

我观察到:1)。当我调用 Runtime.exec("C://Program Files//MyProgram//myprogram.exe") 时,IOException 表示:找不到文件 C:/Program,错误代码 = 2。我认为它必须是一个结果空间的

2)。我试过:Runtime.exec("/"C://Program Files//MyProgram//myprogram.exe/""),IOException表示:找不到文件:"C:/Program Files/MyProgram/myprogram.可执行程序”

3)。我吸取了教训并尝试了 Runtime.exec() 的重载版本: File dir = new File("C://Program Files//MyProgram//"); 然后运行:Runtime.exec("myprogram.exe", null, dir),它说:can't find file myprogram.exe in C:/Program Files/MyProgram/

4)。我试过 1),而不是“程序文件”,我将它重命名为 Program_Files,一切正常

我知道我也可以使用 ProcessBuilder 来做类似的事情,但我心里放不下……(也许是我的弱点)。谁能告诉我为什么 2) 和 3) 不起作用?

谢谢。

4

3 回答 3

5

几分钟前我看到另一个答案,在评论区,我终于找到了解决它的方法。很抱歉,我不知道该答案是如何被删除的……或者谁通过评论答案给出了答案……

更新:通过进一步的调查,我发现是马特凯恩通过评论给出了正确的答案。请允许我对您的帮助表示由衷的感谢。;-)

这是我根据马特的评论处理它的方法,并测试了工作:

String[] cmdArray = new String[]{"C://Program Files//MyProgram//myprogram.exe", arg1, arg2};
Runtime.exec(cmdArray);

其中 arg1 和 arg2 是传递给 myprogram.exe 的两个参数

使用 exec() 的重载版本:

1)进程执行(字符串[] cmdarray)

2)进程执行(字符串[] cmdarray,字符串[] envp)

3)进程执行(字符串[] cmdarray,字符串[] envp,文件目录)

任何一个都可以。这里我想提一下 3) 中的 dir 和 cmdarray 中的绝对路径之间的区别,在我的例子中可能是 ""C://Program Files//MyProgram//"。

在 3) 中的 dir 中,您可以指定运行 .exe 的目录,您指定的所有相关目录都将附加在该 dir 之后。示例:如果你的目录是 C:/Hello World,并且在你的 .exe 中你将在 /folder1 中存储一个文件,最后你会发现该文件位于 C:/Hello World/folder1

但是,dir 不适用于可执行文件。(在我的情况下,它是 myprogram.exe)。例如,如果您的 .exe 位于 C:/Program Files/MyProgram/,并且您已经将 dir 设置为 C:/Program Files/MyProgram。如果不指定可执行文件的绝对路径,就无法成功运行程序。就我而言,您只能通过以下方式成功: cmdarray[0] = "C://Program Files//MyProgram//myprogram.exe" 如果您弄错了,错误将如下所示: java.io.exception:无法运行程序“myprogram.exe”(在目录“C:/Program Files/MyProgram/”中):CreateProcess error=2,系统找不到指定的文件。请注意,它只说“无法在 ** 目录中运行”,而不是说“在 *** 目录中找不到文件”。我认为这很荒谬,但无论如何,那

于 2009-07-09T19:05:08.757 回答
0

尝试在空格前加一个反斜杠...“C:/Program\ and\ Files/MyProgram/myprogram.exe”

您必须使用双反斜杠才能将其传递给操作系统。

如果这不起作用,请尝试 "C:/\"Program and Files\"/MyProgram/myprogram.exe"

于 2009-07-09T16:47:19.830 回答
0

我遇到了同样的问题并使用 c:\PROGRA~1 而不是 c:\program files 解决了它

于 2014-02-24T14:03:39.147 回答