当路径确实存在时,CreateProcess error = 2

时间:2015-06-02 13:29:48

标签: java processbuilder

我正在使用java ProcessBuilder类在我的Windows工作站上启动nmap实例。

以下代码会产生异常:

java.io.IOException: Cannot run program "C:\Program Files (x86)\Nmap\nmap.exe -T4 -A -v --max-scan-delay 0ms --min-rate 1000000 --max-retries 0  -oX -  192.168.1.1 ": CreateProcess error=2, The system cannot find the file specified

命令的值是:

C:\Program Files (x86)\Nmap\nmap.exe -T4 -A -v --max-scan-delay 0ms --min-rate 1000000 --max-retries 0  -oX -  192.168.1.1 

在命令窗口中正确生成运行命令。

有什么想法吗?

String command = this.getCommand().toString();
        ExecutionResults results = new ExecutionResults();
        ProcessBuilder procBuilder = new ProcessBuilder(new String[]{command.toString()});

        try {
            Process e = procBuilder.start();
            results.setErrors(this.convertStream(e.getErrorStream()));
            results.setOutput(this.convertStream(e.getInputStream()));

4 个答案:

答案 0 :(得分:0)

您将整个命令(包括参数)作为ProcessBuilder构造函数的单个参数传递。它需要一个String [],其中第一个项应该是可执行文件的路径,其他项应该是参数。试试

command.split(" ")

而不是

new String[]{command.toString()}

编辑:我看到你的路径中有空格,这会破坏它:(你可以尝试将可执行路径和参数分成两个字符串。构造函数参数将是一个包含路径本身的String []第一个项目,然后是按空格分割的参数数组。

OR:如果你不介意不使用ProcessBuilder,那就更简单了:

Process e = Runtime.getRuntime().exec(command);

答案 1 :(得分:0)

从例外本身来看很简单,

  

java.io.IOException:无法运行程序" C:\ Program Files(x86)\ Nmap \ nmap.exe -T4 -A -v --max-scan-delay 0ms --min-rate 1000000 --max-retries 0 -oX - 192.168.1.1":CreateProcess error = 2,系统

进程构建器将整条线视为可执行文件并尝试运行它。只需使用以下示例,

ProcessBuilder procBuilder = new ProcessBuilder(new String[]{"C:\Program Files (x86)\Nmap\nmap.exe"});
    procBuilder.start();

这样可以正常工作。所以这不是你认为java无法找到可执行文件的问题。它将整行作为可执行文件。你在下面做得更好,

ProcessBuilder procBuilder = new ProcessBuilder(new String[]{"C:\Program Files (x86)\Nmap\nmap.exe", "-T4", "-A"}); //add all params
procBuilder.start();

试试这个,它应该可以正常工作

答案 2 :(得分:0)

正如其他答案所表明的那样,您当前的问题是您传递的是整个命令行,就好像它是要运行的程序的名称一样。 CreateProcess正在寻找名为“C:\ Program Files(x86)\ Nmap \ nmap.exe -T4 -A etc”的程序,但未能找到它。

如果您有一个包含要运行的命令的字符串(带有参数,重定向等的程序名称),那么运行它的最简单方法是通过命令行处理器启动它。这是一个简单的例子:

public static void main(String[] args) throws IOException, InterruptedException {
    String command = "dir /w";
    ProcessBuilder procBuilder = new ProcessBuilder(new String[]{"cmd", "/c", command});
    procBuilder.redirectInput(Redirect.INHERIT);
    procBuilder.redirectOutput(Redirect.INHERIT);
    procBuilder.redirectError(Redirect.INHERIT);
    Process p = procBuilder.start();
    int ecode = p.waitFor();
    System.err.println("Exit code " + ecode);
}

答案 3 :(得分:0)

这可能是由于我的经验中的几个原因

  1. 防火墙将删除安装程序必需的某些文件。因此建议您卸载并重新安装
  2. 也可能是因为文件夹路径中有空格,建议安装在路径中没有空格的新文件夹中。