我需要在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();
答案 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
}