【问题标题】:CreateProcess error=2, The system cannot find the file specifiedCreateProcess error=2, 系统找不到指定的文件
【发布时间】:2013-11-06 11:03:02
【问题描述】:

我正在用 java 编写一个程序,它将执行 winrar 并将我放在 h:\myjar.jar 中的 jar 文件解压缩到文件夹 h:\new 中。我的java代码是这样的

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

public class MainClass {

    public static void main(String[] args) {

        Runtime r = Runtime.getRuntime();
        Process p = null;

        try {
            File dir = new File("C:/Program Files/WinRAR");
            p = r.exec("winrar x h:\\myjar.jar *.* h:\\new", null, dir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行此操作时,我收到此错误

java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at MainClass.main(MainClass.java:16)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 4 more

谁能告诉我为什么会遇到这样的问题。我需要在代码中进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: java process


    【解决方案1】:

    假设winrar.exePATH 中,那么Runtime.exec 能够找到它,如果不是,则需要提供它的完全限定路径,例如,假设winrar.exe 是安装在C:/Program Files/WinRAR 中,您需要使用类似...

    p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");
    

    就个人而言,我建议您使用ProcessBuilder,因为它具有一些额外的配置功能。在可能的情况下,您还应该将命令和参数分成单独的 String 元素,它比单个 String 变量更好地处理诸如空格之类的事情,例如...

    ProcessBuilder pb = new ProcessBuilder(
        "C:/Program Files/WinRAR/winrar",
        "x",
        "myjar.jar",
        "*.*",
        "new");
    pb.directory(new File("H:/"));
    pb. redirectErrorStream(true);
    
    Process p = pb.start();
    

    不要忘记从进程中读取InputStream 的内容,否则可能会停止进程

    【讨论】:

    • 我的情况只是我在 Windows 的系统变量中为该 exe 放入 bin 的路径
    • 我使用 python.exe 目录的完整路径运行 python 代码。谢谢
    【解决方案2】:

    我使用了 ProcessBuilder,但遇到了同样的问题。问题在于使用命令作为一个字符串行(就像我在 cmd 中键入它一样)而不是字符串数组。在上面的例子中。如果我跑了

    ProcessBuilder pb = 
       new ProcessBuilder("C:/Program Files/WinRAR/winrar x myjar.jar *.* new");
    pb.directory(new File("H:/"));
    pb.redirectErrorStream(true);
    
    Process p = pb.start();
    

    我遇到了一个错误。但是如果我跑了

    ProcessBuilder pb = 
       new ProcessBuilder("C:/Program Files/WinRAR/winrar", "x", "myjar.jar", "*.*", "new");
    pb.directory(new File("H:/"));
    pb.redirectErrorStream(true);
    
    Process p = pb.start();
    

    一切正常。

    【讨论】:

    • 这为我解决了问题。关键是pb.directory(...) 声明。正如下面其他人提到的,一旦你这样做了,你就可以将 exe 的名称作为第一个命令参数。我也必须像这样使用 cmd /c List&lt;String&gt; params = Arrays.asList("cmd", "/c", "quack1.exe", "inputfile.txt", "param1", "param2", "A"); ProcessBuilder pb = new ProcessBuilder(params); pb.directory(new File("C:/dev/test")); Process pr = (pb).start();
    【解决方案3】:

    您指定的dir 是正在运行的进程的工作目录——它对查找可执行文件没有帮助。使用cmd /c winrar ... 运行进程在PATH 中寻找可执行文件或尝试使用绝对 路径到winrar

    【讨论】:

    • 你能告诉我知道绝对路径的命令吗..?
    • p = rt.exec(new String[] {"C:\Program Files\WinRAR\winrar.exe", "x", "h:\\myjar.jar", ".", "h:\\new" } null, dir);...我仍然遇到同样的错误。
    • 如果你执行rt.exec(new String[] {"cmd", "/c", "winrar.exe x h:\\myjar.jar . h:\\new"}, null, dir)会怎么样?
    【解决方案4】:

    exec 的完整第一个参数被解释为可执行文件。使用

    p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
                null, 
                dir);
    

    【讨论】:

    • winrar.exe 在你的路径上吗?
    • 我刚刚安装了winrar...我没有设置winrar的环境路径
    • 它必须在 PATH 上,否则您必须指定完整路径以及可执行文件
    【解决方案5】:

    我的建议是保留getRuntime().exec,因为exec 使用ProcessBuilder

    试试

     p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);
    

    【讨论】:

      【解决方案6】:

      任何一种方式都对我有用:Runtime.getRuntime().exec(...) 或使用 ProcessBuilder。仍然对于某些调用,它仍然失败,并出现与原始问题中所述相同的错误:“CreateProcess error=2,系统找不到指定的文件”。仔细检查,那是因为我正在执行一个使用当前目录引用 (%~dp0) 的命令文件。显然,即使从同一目录调用命令,它们也不起作用。使用绝对路径解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-11
        • 2013-11-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2018-09-17
        • 1970-01-01
        相关资源
        最近更新 更多