Runtime.exec(String)限制字符串

时间:2013-08-22 12:48:46

标签: java

我尝试使用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 \ Start"处被切断。什么时候它应该继续" \ Windows \ Startup \ run.bat" ..有没有我可以使用的替代方案?

4 个答案:

答案 0 :(得分:1)

正如我从你给出的错误中看到的那样,我希望它是一个过去的副本,你出于某种原因字符串runner.getPath()以“\”“开头和结尾”,这使整个路径无效。检查并删除如果需要的话

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

runner.getAbsolutePath()

另外,如果runner是文件,getPath将为您提供包含路径的文件路径,因此您的代码肯定无法正常工作。改为使用:

String path = runner.getPath();
path = path.substring(0, path.lastIndexOf("\\")) + "\\run.bat";
Runtime.getRuntime().exec(path);

答案 1 :(得分: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();

答案 2 :(得分:1)

runner视为文件实例,这应该可行。

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

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

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

答案 3 :(得分:0)

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

所以,写

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

是获取正确信息的绝佳方式。