1

我正在尝试使用 Java 函数Runetime.exec(String)在 Windows 7 计算机的启动文件夹中运行程序,如下所示:

Runtime.getRuntime().exec(runner.getPath() + "\\run.bat");

当我运行它时,我收到一条错误消息,指出无法运行该命令:

Exception in thread "main" java.io.IOException: Cannot run program ""C:\Users\ly
ndsey\AppData\Roaming\Microsoft\Windows\Start": CreateProcess error=2, The syste
m cannot find the file specified

如您所见,当文件名应继续为“\Windows\Startup\run.bat”时,文件名在“\Windows\Start”处被截断。我可以使用其他替代方法吗?

4

4 回答 4

1

正如我从您给出的错误中看到的那样,我希望它是过去的副本,runner.getPath()由于某种原因,您的字符串以“\”“开始和结束,这使得整个路径无效。检查并在需要时将其删除

如果您已经拥有该文件并且只需要它的路径,您可以使用

runner.getAbsolutePath()

另外,如果 runner 是一个文件,它getPath会给你包含路径的文件路径,所以你的代码肯定不会工作。改为使用:

String path = runner.getPath();
path = path.substring(0, path.lastIndexOf("\\")) + "\\run.bat";
Runtime.getRuntime().exec(path);
于 2013-08-22T12:53:22.337 回答
1

考虑runner作为一个 File 实例,这应该可以工作。

Desktop.getDesktop().open(new File(runner, "run.bat"));

它使用Desktopclass 而不是Runtime,因此您不必将File(runner) 转换为它的String表示形式(这很容易出错)。Runner 现在“按原样”用作您要执行的“run.bat”的父目录。

类的其他优点Desktop:您现在可以打开任何您想要的文件。

于 2013-08-22T13:25:58.910 回答
1

作为替代方案,您可以使用ProcessBuilder. 我觉得ProcessBuilderRuntime.getRuntime().exec http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html更安全

    String[] command = {"CMD", "/C", "dir"};
    ProcessBuilder pb = new ProcessBuilder( command );
    //set up your work directory if needed
    pb.directory(new File("c:\\path"));

    Process process = pb.start();
于 2013-08-22T13:09:43.817 回答
0

您应该避免exec(String)尝试将整个字符串解析为命令 + 参数的方法。安全选项是exec(String[]),它假定第一个数组元素是命令,其余的是参数。

所以,写

Runtime.getRuntime.exec(new String[] { yourCommandString })

是传递正确信息的可靠方法。

于 2013-08-22T13:03:44.267 回答