5

有什么方法可以从快捷方式打开记事本或其他应用程序?

这是我的代码:

import java.io.File;
import java.io.IOException;

public class acrobat {

    public static void main(String[] args) throws IOException, InterruptedException {
         String[] notepad = {"C:\\Users\\Desktop\\notepad.lnk"};

         Process p = Runtime.getRuntime().exec(notepad);
         p.waitFor();
    }
}

我想从快捷方式打开应用程序,但我收到错误..

    Exception in thread "main" java.io.IOException: Cannot run program "C:\Users\robert\Desktop\notepad.lnk": CreateProcess error=193, %1 is not a valid Win32 application
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at acrobat.main(acrobat.java:11)
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32 application
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 4 more

如果我只写notepad.exe而不是它的工作但是,路径它不起作用。有什么方法可以用快捷方式打开吗?

4

2 回答 2

7

您在桌面上看到的快捷方式实际上是一个扩展名为.lnk. 真正的完整路径是:

C:\Users\Desktop\notepad.exe.lnk

尝试运行它exec()会产生“CreateProcess 错误...不是有效的 Win32 应用程序”错误。


幸运的是,您也可以通过ProcessBuilder实用程序类运行它们。

public static void main(String[] args) throws Exception {
  ProcessBuilder pb = new ProcessBuilder("cmd", "/c",
                                      "C:\\Users\\robert\\Desktop\\notepad.lnk");
  Process p = pb.start();
  p.waitFor();
}



如果必须使用Runtime.getRuntime().exec(),可以lnk通过以下方式打开文件rundll32

Process p = Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL " +
                                      "C:\\Users\\robert\\Desktop\\notepad.lnk");
p.waitFor(); // watch out

但请记住,通过这种方法,p.waitFor();和类似的方法调用可能不会有预期的结果:如您所见,创建的进程是rundll32,而不是快捷方式的 ( notepad.exe)

于 2013-07-25T14:02:18.387 回答
2

查看Desktop.open(File)和相关的方法。

  • 打开文本文件的默认编辑器比加载“裸”程序更有意义。
  • 它适用于存在文件关联的所有文件。
  • 它适用于 OS X 和 *nix。
  • 不会疏远喜欢在 TextPad、MS Word 或..

但是,如果您真的必须打开链接..

阅读(并实施)When Runtime.exec() won't的所有建议。那可能会解决问题。如果不是,它应该提供更多关于失败原因的信息。然后忽略它所指的并使用. 还要打破 a来解释本身包含空格的参数。execProcessProcessBuilderString argString[] args

于 2013-07-25T14:09:04.650 回答