【问题标题】:Run .exe file in Java from file location从文件位置运行 Java 中的 .exe 文件
【发布时间】:2012-05-27 23:47:42
【问题描述】:

我必须从我的 Java 程序中打开一个 .exe 文件。所以我首先尝试了以下代码。

Process process = runtime.exec("c:\\program files\\test\\test.exe");

但我遇到了一些错误。然后我发现必须从 c://program files/test/ 那个位置启动 exe,然后它才会打开而没有错误。所以我决定编写一个 .bat 文件并执行,以便它会 cd 到该位置并执行 .exe 文件。

以下是我的代码:

BufferedWriter fileOut;

String itsFileLocation = "c:\\program files\\test\\"
    System.out.println(itsFileLocation);
    try {
     fileOut = new BufferedWriter(new FileWriter("C:\\test.bat"));
     fileOut.write("cd\\"+"\n");
     fileOut.write("cd "+ itsFileLocation +"\n");
     fileOut.write("test.exe"+"\n");
     fileOut.write("exit"+"\n");
     
     fileOut.close(); // Close the output stream after all output is done.
    } catch (IOException e1) {
     e1.printStackTrace();
    } // Create the Buffered Writer object to write to a file called filename.txt
    Runtime runtime = Runtime.getRuntime();
    try {
     Process process =runtime.exec("cmd /c start C:\\test.bat");
    } catch (IOException e) {
     e.printStackTrace();
    }

上面的代码完美运行。但是,命令提示符也在我的 .exe(应用程序)后面打开。它仅在 .exe 文件退出后才会关闭..

当我的应用程序统计时,我需要关闭我的命令提示符。

我的 .bat 文件被程序写入后会如下所示。

cd\
cd C:\Program Files\test\
test.exe
exit

【问题讨论】:

    标签: java windows batch-file exe bufferedreader


    【解决方案1】:

    使用 java 通过命令行运行 bat 或任何其他方法的标准代码是:

    runtimeProcess = Runtime.getRuntime().exec("cmd /c start cmd.exe /C\""+backup_path+"\"");
    int processComplete = runtimeProcess.waitFor();
    

    您可以使用 & 分隔符继续多个文件,例如:&&

    【讨论】:

      【解决方案2】:

      这也行。

       Process process = new ProcessBuilder("C:\\Users\\test\\Downloads\\Termius.exe").start();
      

      它将在该文件位置启动 .exe。

      【讨论】:

      【解决方案3】:

      运行exe文件的最佳方式

      制作 java.awt.Desktop 对象和等于 Desktop.getDesktop();

      Desktop desktop = Desktop.getDesktop(); desktop.open("file path");

      运行exe文件:

      desktop.open("C:\\Windows\\System32\\cmd.exe");

      desktop.open("C:/Windows/System32/cmd.exe");

      运行网址:

      desktop.browse(new URI("http://www.google.com"));

      【讨论】:

        【解决方案4】:

        另一种运行文件的方式如下:

        import java.awt.Desktop;
        import java.io.File;
        
        public static void open(String targetFilePath) throws IOException
        {
            Desktop desktop = Desktop.getDesktop();
        
            desktop.open(new File(targetFilePath));
        }
        

        【讨论】:

          【解决方案5】:

          您不需要控制台。您可以使用工作目录执行进程:

          exec(String command, String[] envp, File dir)

          在单独的进程中执行指定的字符串命令 使用指定的环境和工作目录。

          • command 是 .exe 的位置
          • envp 可以为空
          • dir,是你的.exe的目录

          关于您的代码,它应该是...

          Runtime.getRuntime().exec("c:\\program files\\test\\test.exe", null, new File("c:\\program files\\test\\"));
          

          【讨论】:

          • Java 将正确地将 / 解释为 windows 上的文件分隔符 -- 至少在 windows 7 上。
          • @schifty:实际上我们不需要在exec(String command, String[] envp, File dir)的第一个参数中给出test.exe的完整路径。所以基本上Runtime.getRuntime().exec("test.exe", null, new File("c:\\program files\\test\\")); 已经足够好了。
          • @KuldeepJain 这并不完全正确,而且有点误导。如果 exe 在 PATH 中,则不需要它的真正完整路径,否则,它是。
          • @Nom1fan,看起来你没有很好地遵循我的评论。路径可以在第三个参数中指定。我提到不要在第一个参数中给出完整路径。请参阅我在评论中给出的示例。您还可以通过以下方式进一步阅读:docs.oracle.com/javase/7/docs/api/java/lang/…
          【解决方案6】:

          您可以使用Runtime.exec(java.lang.String, java.lang.String[], java.io.File) 来设置工作目录。

          否则你可以使用ProcessBuilder,如下:

          ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
          pb.directory(new File("myDir"));
          Process p = pb.start();
          

          【讨论】:

          • 谢谢 Kuldeep 我已经尝试过了。它不工作我得到了同样的错误。当我启动 .exe 文件时,它期望我在 .exe 文件的同一目录中
          • 如果可能的话,您能否给出 Runtime.exec 示例..关于我的代码..提前谢谢..
          • 感谢 Kuldeep,我也尝试过 ProcessBuilder.. 我遇到了同样的问题..
          • .exe 文件需要该位置的一些属性文件才能启动。我可以做的一件事是我可以将该路径设置为 env 变量。我不确定这是否可行。跨度>
          • @DilipRajkumar 尝试此解决方案时遇到什么错误?此解决方案是做您想做的事情的正确方法,并且不会产生您希望避免的 cmd.exe 窗口(也不会在您的系统上产生临时文件)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-28
          • 2012-09-13
          • 1970-01-01
          • 2016-04-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多