exec()问题,而不是打开文件

时间:2011-04-16 16:07:16

标签: java exec runtime.exec

所以继承我的问题,我正在尝试让我的jar文件在每个文件打开之间打开5个文件。当runPrograms []设置为notepad.exe而不是直接文件路径时,它将打开记事本就好了。但是,每当我尝试打开当前代码中的文件时,它都无法完成任何操作。我尝试将Jar放在文件夹Startup中,与其他文件夹一起缩短路径并且不起作用。

当我手动打开文件时,它们都可以正常工作,因此文件没有兼容性问题。我相信我的问题在于文件路径。我试过前进和反斜杠,但它仍然没有打开任何文件。

import java.lang.*
import java.io.*

public class LoadFiles
{
    public static void main(String args[])throws IOException
    {
        Runtime r = Runtime.getRuntime();
        String[] runPrograms = new String[5];
        runPrograms[0] = "C:/Users/Dark/Desktop/Startup/MaNGOS-Fun-Server-Repack-1.20/Server/Apache.bat";
        runPrograms[1] = "C:/Users/Dark/Desktop/Startup/MaNGOS-Fun-Server-Repack-1.20/Server/MySQL.bat";
        runPrograms[2] = "C:/Users/Dark/Desktop/Startup/MaNGOS-Fun-Server-Repack-1.20/MaNGOS-Server/realmd.exe";
        runPrograms[3] = "C:/Users/Dark/Desktop/Startup/MaNGOS-Fun-Server-Repack-1.20/MaNGOS-Server/mangosd.exe";
        runPrograms[4] = "C:/Users/Dark/Desktop/Startup/Ventrilo Server/ventrilo_srv.exe";

        int[] timePrograms = new int[5];
        timePrograms[0] = 5000;
        timePrograms[1] = 5000;
        timePrograms[2] = 5000;
        timePrograms[3] = 5000;
        timePrograms[4] = 5000;

        for(int i=0;i<5;i++)
        {
            try
            {
                 r.exec(runPrograms[i]);
                 Thread.sleep(timePrograms[i]);
             }
             catch
             {
                  System.out.println("Error==="+e.getMessage());
                  e.printStackTrace();
              }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您无法直接运行“.bat”文件 - 与“exe”不同,它们不是可执行映像。您可以使用“cmd.exe”来运行批处理文件,例如通过命令行"cmd.exe /c myfile.bat"

请参阅How do I run batch files from my java application?

编辑:由于某些路径包含空格,并且某些进程可能依赖于工作目录,因此最好使用:

exec(String[] cmd, String[] env, File dir)  ([javadoc][2])

目前,您的命令行正在被解析,因此其中包含空格的路径将被拆分为命令和参数。使用这种形式的exec可以避免解析。某些程序可能需要指定工作目录。目前,每个子进程都获取父进程的工作目录,这可能不是这些子进程所需要的。

EDIT2: 当您运行常规进程(即exe)时,请调用

exec(new String[] { filename }, null, workingDirectory) 

要启动批处理文件,您正在运行cmd.exe,它传递两个参数/ C和您的批处理文件。所以

exec(new String[] { "cmd.exe", "/c", batchFile }, null, workingDirectory)

答案 1 :(得分:1)

使用复制/粘贴对问题进行排序后(奇迹:这有多难?),请查看When Runtime.exec() won't。看完之后,实现该文档的所有建议(1)。

1)即使你修改了代码来编译,&amp; mdma提到的问题,代码仍然会有问题。