系统找不到指定的文件 java

The system cannot find the file specified java

是的,我已经知道这个问题是重复的,但请耐心等待。 None 个其他问题回答了此问题。

这是我的代码:

package pc.setup;

import java.io.IOException;

public class DirectoryCreator {
    public static void setupDirectories() throws IOException {
        Runtime.getRuntime().exec("cd\");
    }
}

这是我得到的错误:

Exception in thread "main" java.io.IOException: Cannot run program "cd\": 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 java.lang.Runtime.exec(Unknown Source)
    at pc.setup.DirectoryCreator.setupDirectories(DirectoryCreator.java:7)
    at pc.load.PieClickerRunner.main(PieClickerRunner.java:9)
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)
    ... 6 more

这里有两个问题:

  • cd 本身不是可执行文件;它是命令 shell 的内置命令。 exec 只有 运行s 可执行文件(在它们自己的文件中)。这就是为什么找不到它的原因。 exec 可以 运行 命令 shell,但是 ...
  • 即使您确实在命令 shell 中更改了目录,该更改也仅对新生成的进程有效,对启动它的程序无效。

抱歉,该方法不适用于 Java。

我假设您在 Windows 操作系统家族下 运行 安装此应用程序(否则您将不得不稍微调整一下)。 Runtime.exec() 方法用于执行可执行命令。 dir, cd, copy, 不是这种情况...因此,它会触发您遇到的异常。

cd 命令是 windows 命令解释器的一部分 cmd. 它可以用 command.comcmd.exe 执行,具体取决于版本操作系统。

因此我们应该先运行命令解释器并向它提供用户提供的命令(例如dir, cd, copy, ...)

这是一个执行此操作的程序。它检查 os.name 环境变量以便 select 正确的命令解释器。我测试 Windows NT 和 Windows 95。如果找到这两个中的 none 但仍然是 Windows 操作系统,那么我认为它是现代 windows (例如 Windows 7 或 Windows 8)并且它正在使用 cmd.exe.

import java.util.*;
import java.io.*;
class StreamGobbler extends Thread
{
    InputStream is;
    String type;

    StreamGobbler(InputStream is, String type)
    {
        this.is = is;
        this.type = type;
    }

    public void run()
    {
        try
        {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
         } catch (IOException ioe)
         {
            ioe.printStackTrace();  
         }
    }
}
public class GoodWindowsExec
{
    public static void main(String args[])
    {
        if (args.length < 1)
        {
            System.out.println("USAGE: java GoodWindowsExec <cmd>");
            System.exit(1);
        }

        try
        {            
            String osName = System.getProperty("os.name" );
            System.out.println("OS NAME IS " + osName);
            String[] cmd = new String[3];
            if( osName.equals( "Windows NT" ) )
            {
                cmd[0] = "cmd.exe" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            }
            else if( osName.equals( "Windows 95" ) )
            {
                cmd[0] = "command.com" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            } else if (osName.toUpperCase().trim().contains("WINDOWS")) {
                cmd[0] = "cmd.exe" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            }

            Runtime rt = Runtime.getRuntime();
            System.out.println("Execing " + cmd[0] + " " + cmd[1] 
                           + " " + cmd[2]);
            Process proc = rt.exec(cmd);
            // any error message?
            StreamGobbler errorGobbler = new 
                StreamGobbler(proc.getErrorStream(), "ERROR");            

            // any output?
            StreamGobbler outputGobbler = new 
                StreamGobbler(proc.getInputStream(), "OUTPUT");

            // kick them off
            errorGobbler.start();
            outputGobbler.start();

            // any error???
            int exitVal = proc.waitFor();
            System.out.println("ExitValue: " + exitVal);        
        } catch (Throwable t)
          {
            t.printStackTrace();
          }
    }
}

这里有一个简单的 运行ner class

public class GoodWindowsExecRunner {

    public static void main(String[] args) {
        //GoodWindowsExec.main(new String[] {"dir *.*"});
        GoodWindowsExec.main(new String[] {"cd .."});
    }

}

这是执行"cd .."命令的结果

这是执行 "dir ." 命令的结果

java 世界上有一篇很棒的文章叫做 When Runtime.exec won't

谢谢大家的回答。不过,它们很冗长,所以在这个答案中,我将尝试对其进行总结。

当您调用 Runtime.getRuntime.exec() 时,您必须指定您正在使用的 shell(仅限 Windows)。所以,你会说 Runtime.getRuntime.exec("command here", "cmd.exe")。您可能知道,CMD 是现代 Windows 操作系统的 Windows 命令 shell。

再次感谢您的回答。