在Java中执行命令行操作

6
我编写了一个非常简单的程序来测试在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

请注意,当我将命令复制/粘贴到命令提示符窗口时,文件可以成功移动。
我错过了什么?所有其他问题似乎都表明这应该有效。
谢谢!
编辑:现在可以工作了,感谢大家的帮助!很烦人的是,“move”是cmd.exe的一个参数。我希望他们能让它像复制和粘贴一样适用于.exec()方法调用。不过没关系。
4个回答

6

"move" 命令是 cmd.exe 解释器的一部分,而不是一个可执行文件。

以下命令可以正常工作:

cmd.exe /c move file1 file2 

3

试试这个:

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

-1 是因为这个调用实际上除了打开命令提示符之外不会做任何事情。 - Wug
1
我会修复它,因为这只是一个三个字符的编辑,而且我不喜欢给别人点踩。 - Wug

2
在 Windows 中,与 UNIX 不同,move 不是一个独立的程序。你需要使用 move 作为参数调用命令处理器 CMD。阅读 CMD 的命令行帮助文档,有一个标志需要设置。

0

move 实际上不是一个程序,而是一个 shell 内置命令。可以使用类似以下的命令:

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

一个好的编程实践是始终使用绝对路径来调用外部程序。(当然,在这种情况下,更好的做法是使用Files.move或等效方法,而不是依赖于特定平台的shell调用)


此外,使用 shell 调用会导致命令提示框出现并在 shell 调用执行时消失。如果我正在使用企业级 Java 程序并看到这种情况,我会感到恐慌。只是说一下。 - Wug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接