从Java中运行命令行操作

时间:2012-10-29 18:26:36

标签: java command-line

我构建了一个非常简单的程序来测试运行独立于Java的命令行操作。那就是:后来我希望能够使用" move"修改此代码。我可以进入命令行的任何其他命令(包括调用其他非Java软件)。

我确实搜索并阅读了大约二十几个答案,但是他们都建议我正确地尝试这个,对我的简单测试是无关紧要的,或者提出其他不起作用的解决方案(比如使用.exec(String [])方法)而不是.exec(String) - 结果相同!)。

这是我的代码:

import java.io.IOException;

public class RunCommand {

private static final String PATH_OUT = "C:\\Users\\me\\Desktop\\Temp\\out\\";
private static final String FILE = "sample.txt";
private static final String PATH_IN = "C:\\Users\\me\\Desktop\\Temp\\in\\";

public static void main(String[] args) {
    try {
        String command = "move "+PATH_IN+FILE+" "+PATH_OUT;
        System.out.println("Command: "+command);
        Runtime.getRuntime().exec(command);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

以下是我在运行时看到的输出:

Command: move C:\Users\myingling\Desktop\CDS\Temp\in\sample.txt C:\Users\myingling\Desktop\CDS\Temp\out\
java.io.IOException: Cannot run program "move": 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 RunCommand.main(RunCommand.java:13)
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)
... 5 more

请注意,当我将命令复制/粘贴到命令提示符窗口时,文件会成功移动。

我错过了什么?我读过的所有其他问题似乎表明这应该有效。

谢谢!

编辑立即行动,感谢大家的帮助!令人讨厌的是,它隐藏着“移动”的方式。是cmd.exe的参数。我希望他们在调用.exec()方法时复制/粘贴时有效。哦,好吧。

4 个答案:

答案 0 :(得分:6)

&#34;移动&#34; command是cmd.exe解释器的一部分,而不是可执行文件。

这样可行:

cmd.exe /c move file1 file2 

答案 1 :(得分:3)

试试这个:

 Runtime.getRuntime().exec("cmd.exe /c move "+PATH_IN+FILE+" "+PATH_OUT);

答案 2 :(得分:2)

在Windows中,与UNIX不同,move不是单独的程序。你需要将命令处理器CMD与move作为参数。阅读CMD上的命令行帮助,你必须设置一个标志。

答案 3 :(得分:0)

move实际上不是一个程序,它是一个shell内置命令。使用类似的东西:

String command = PATH_TO_SYSTEM32 + "\\cmd.exe /c move \""+PATH_IN+FILE+"\" \""+PATH_OUT + "\"";

好的做法是始终对外部程序使用绝对路径。 (嗯,在这种情况下的好习惯是使用Files.move或等效而不是依赖于平台的shell调用)