如何在单个cmd窗口中使用java Runtime执行cd命令

时间:2015-06-29 19:22:31

标签: java cmd

我需要在cmd提示符中执行以下Change目录命令,但是使用java来执行它们。 dir命令工作正常,但不是cd。我必须在单个cmd窗口中执行它们

cd inputDir
dir
cd outputDir

inputDir和outputDir是windows中的目录。

Java代码段:

ArrayList<String> dosCommands = new ArrayList<String>();
Process p;
for (int i=0;i< dosCommands.size();i++){
    p=Runtime.getRuntime().exec("cmd.exe /c "+dosCommands.get(i)); 
    p.waitFor();
    BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line=reader.readLine();
    while(line!=null) 
    { 
        System.out.println(line); 
        line=reader.readLine(); 
    } 
}

更新

将参数更改为cmd.exe / k而不是/ c

p=Runtime.getRuntime().exec("cmd.exe /k "+dosCommands.get(i)); 

我不得不删除

p.waitFor(); 

方法,因为我被困在里面。 这样做,知道我确实陷入了

line.reader.readLine(); 

3 个答案:

答案 0 :(得分:2)

使用

cmd.exe /K

cmd.exe /c

您可以找到有关cmd params here

的更多信息

使用/ c,cmd完成并退出。使用/ k时,它不会退出。

<强> __ UPDATE __

我的意思如下:

cd inputDir
dir
cd outputDir
exit

请注意最后一行。

__更新2 __

请根据运行流程使用代码中的类似内容查找当前工作目录:

public class JavaApplication1 {
  public static void main(String[] args) {
       System.out.println("Working Directory = " +
              System.getProperty("user.dir"));
  }
}

之后,让我们确保您尝试cd的文件夹存在于该文件夹中。

答案 1 :(得分:0)

尝试此实验:打开命令窗口(使用鼠标和/或键盘,而不是代码)。现在使用cd \cd C:\Windows等命令更改为其他目录。

然后打开第二个命令窗口。它目前的目录是什么?它记得你在第一个命令窗口中做了什么吗?

没有,因为每次运行cmd.exe时,您都会启动一个具有自己当前目录状态的新进程。

在您的代码中,您在for循环的每次迭代中执行新的cmd.exe进程。每次启动新的cmd.exe时,它都不知道当前目录在其他cmd.exe实例中的含义。

您可以设置进程执行的当前目录:

String inputDir = "C:\\Users\\eleite\\Workspace\\RunCmd\\Petrel_Logs";
p = Runtime.getRuntime().exec("cmd.exe /c " + dosCommands.get(i),
    null, inputDir); 

答案 2 :(得分:0)

如果你想

  • 创建流程模拟控制台
  • 并使此控制台执行少量命令
  • 执行这些命令后,继续执行主线程
  • 的代码

然后尝试此代码

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/k");
pb.redirectOutput(Redirect.INHERIT);//redirect process output to System.out
pb.redirectError(Redirect.INHERIT);//redirect process output to System.err
Process p = pb.start();

try(PrintWriter pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream()), true)){
    pw.println("dir");//execute command 1, for instance "dir"
    pw.println("ver");//execute command 2, for instance "ver"
    //... rest of commands
    pw.println("exit");//when last command finished, exit console
}
p.waitFor();//this will make main thread wait till process (console) will finish (will be closed)
//here we place rest of code which should be executed after console after console process will finish
System.out.println("---------------- after process ended ----------------");

因此,如果您想要执行的命令列表,只需将它们放在这里:

try(PrintWriter pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream()), true)){

    //here and execute them like 
    for (String command : dosCommands){
        pw.println(command);
    }        

    pw.println("exit");//when last command finished, exit console
}