6

我构建了一个非常简单的程序来测试运行独立于 Java 的命令行操作。那就是:稍后我希望能够将此代码从使用“移动”修改为我可以在命令行中输入的任何其他命令(包括调用其他非 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

4 回答 4

6

“move”命令是 cmd.exe 解释器的一部分,它本身不是可执行文件。

这会起作用:

cmd.exe /c move file1 file2 
于 2012-10-29T18:28:39.487 回答
3

尝试这个:

 Runtime.getRuntime().exec("cmd.exe /c move "+PATH_IN+FILE+" "+PATH_OUT);
于 2012-10-29T18:34:47.933 回答
2

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

于 2012-10-29T18:29:28.207 回答
0

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

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

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

于 2012-10-29T18:33:56.857 回答