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

如何在单个cmd窗口中使用java运行时执行cd命令,java,cmd,Java,Cmd,我需要在cmd提示符中执行以下Change directories命令,但要使用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

我需要在cmd提示符中执行以下Change directories命令,但要使用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(); 
    } 
}
我不得不把灯拆了

p.waitFor(); 
方法,因为我被它绊住了。 这样做,我知道我会在

line.reader.readLine(); 
使用

不是

你可以找到更多关于

使用/c,cmd结束并退出。使用/k时,它不会退出

更新

我的意思是:

cd inputDir
dir
cd outputDir
exit
请注意最后一行

\uuuuu更新2\uuuuuu

请在代码中使用类似的内容,根据正在运行的进程,找出当前工作目录:

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

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

试试这个实验:打开一个命令窗口(使用鼠标和/或键盘,而不是代码)。现在,使用类似于
cd\
cdc:\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); 
如果你想

  • 创建流程模拟控制台
  • 让这个控制台执行一些命令
  • 执行这些命令后,继续从主线程执行代码
然后试试这个代码

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
}

你能更详细地描述一下“不起作用”是什么意思吗?你能提供一些你的代码输出和你期望发生的事情吗?这个命令有效,但是你没有得到任何答案。执行命令后,cmd.exe关闭。@IvanMushketyk是的,当我执行cd inputDir时,它应该将目录更改为input dir目录。我通过在cd-inputDir之后执行dir命令来检查这一点。很遗憾,dir命令打印了另一个目录。您是否有可能将目录从一个分区更改为另一个分区?如果是这样的话,你需要先使用“cd”,然后使用cd这里是我尝试执行的一些cd命令:cd C:\Users\eleite\Workspace\RunCmd\Petrel\u Logs cd C:\Users\eleite\Workspace\RunCmd\petrel2014licensemulelogging这似乎是解决方案的路径,但现在我无法读取一行的输出并在p.waitFor()处被卡住;您是否尝试在批处理文件末尾添加exit语句?我需要在单个cmd窗口中执行所有命令,而不是逐个执行。@Eduardox23以下是代码示例:(不适用于ideone,但应适用于您的窗口)。@Eduardox23您至少取得了一些进展吗?如果是,请更新您的问题,以便我们知道您的位置。如果没有,你会在运行脚本后发布你的想法吗?(如屏幕截图、错误等)。是的,你是对的。有没有办法在一个cmd窗口中执行所有命令?因此,我不必通过命令传递dir?将命令写入.bat文件,并将其传递给cmd.exe/c。@Eduardox23您可以通过其输入流将每个命令传递给Process handling console。如果您不想在主线程中执行此操作,请创建单独的一个。@vgr我不想使用.bat文件,我希望所有命令都在java代码中。@Pshemo我很抱歉我没有得到它,您能提供一个示例吗?
String inputDir = "C:\\Users\\eleite\\Workspace\\RunCmd\\Petrel_Logs";
p = Runtime.getRuntime().exec("cmd.exe /c " + dosCommands.get(i),
    null, inputDir); 
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
}