Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java应用程序执行本机DOS命令_Java_Windows_Cmd - Fatal编程技术网

从Java应用程序执行本机DOS命令

从Java应用程序执行本机DOS命令,java,windows,cmd,Java,Windows,Cmd,我对从Java应用程序执行cmd.exemove命令感兴趣 我知道如何从Java内部调用外部进程。StackOverflow中有100个关于这一点的问题。我不明白的是命令行应该是什么样子 例如,在DOS窗口中,这是我键入的命令: move dirA dirB 目录dirA被移动到目录dirB。这正是我想要做的。由于需要太多的上下文,并且会影响问题的解决,在我关心的特定上下文中,纯java解决方案不是一个选项。(哦,在庞大而复杂的遗留系统中操作的乐趣!) 我从java调用的外部系统命令是什么?看

我对从Java应用程序执行cmd.exe
move
命令感兴趣

我知道如何从Java内部调用外部进程。StackOverflow中有100个关于这一点的问题。我不明白的是命令行应该是什么样子

例如,在DOS窗口中,这是我键入的命令:

move dirA dirB
目录
dirA
被移动到目录
dirB
。这正是我想要做的。由于需要太多的上下文,并且会影响问题的解决,在我关心的特定上下文中,纯java解决方案不是一个选项。(哦,在庞大而复杂的遗留系统中操作的乐趣!)

我从java调用的外部系统命令是什么?看起来应该是:

"cmd move dirA dirB"

然而,这对我来说是失败的。我对这一点很熟悉,但它没有直接回答我的问题。

不保证,但我认为,您需要将运行Windows命令shell的命令添加到要执行的命令之前。
/c
开关在所需命令完成后终止命令shell。
尝试:

Runtime.getRuntime().exec("cmd /c move dirA dirB");
编辑:

作为 我在下面的评论中注意到,当一个或两个目录的路径中都有空格时,考虑这种情况也很重要。因此,使用单独的字符串来形成finall命令要安全得多,如下所示:

new ProcessBuilder("cmd", "/c", "move", pathToDirA, pathToDirB).start()

“只是:…”
——这就引出了一个问题:当你尝试这个方法时发生了什么?@hovercraftfullofels改写了,感谢你指出了我的错误提问礼仪。请注意,
exec
的单字符串版本在如何将命令行拆分为单独的标记方面相当简单。如果dirA和/或dirB的名称可能包含空格,则应使用
字符串[]
版本,并自行拆分。或者更好的是,
newprocessbuilder(“cmd”、“/c”、“move”、pathToDirA、pathToDirB).start()
当然,胡佛的问题是关于应该使用的外部命令的语法。我试着用它的基本形式提供答案。您的贡献考虑的是如何使它不那么容易出错。
/c
就是问题所在。@IanRoberts:ProcessBuilder是否实际尝试引用单个参数(如果参数中有空格)?(请记住,在Windows中,单字符串版本是本机版本;也就是说,如果您传递一个令牌数组,则必须将它们连接到一个字符串中,才能传递给新进程。)@HarryJohnston显然是这样,请参见第130行。事实上,如果您使用单个字符串
Runtime.exec
,这将把字符串分割成单独的参数,并将这些参数传递给
string[]
版本,该版本(在Windows上)将通过适当的引用将它们重新组合成单个字符串,传递到本机端。。。