(就像其他人说的那样) 对于简单的命令,你可以直接执行,例如:
Runtime.getRuntime().exec("cmd /c mkdir H:\\test\\BBB");
(cmd /c
可能是必需的)
然而,对于一些复杂的命令,你可能需要执行一个双重的 cmd.exe /c cmd.exe /c
,
否则(如果你只使用一个),cmd会被静默地丢弃,
(或者如果你不使用/c
或使用一些奇怪的/c
cmd
组合模式,cmd可能会冻结),
我不知道为什么。
((我是如何发现它的?-- 我无法让它工作并尝试了多次;有一次我意外地复制了cmd并运行了它,然后发现了这个问题。))
@eg::
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class T1 {
static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
public static void main(String[] args) throws InterruptedException, IOException {
Process process;
System.out.println("---");
Runtime.getRuntime().exec("cmd /c mkdir H:\\test\\BBB");
System.out.println("---");
process = Runtime.getRuntime().exec("cmd.exe /c dir C:\\");
System.out.println(convertStreamToString(process.getInputStream()));
System.out.println("---");
process = Runtime.getRuntime().exec("cmd.exe /c echo \"Some Line\"");
System.out.println(convertStreamToString(process.getInputStream()));
System.out.println("---");
process = Runtime.getRuntime().exec("cmd.exe /c cmd.exe /c \"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysqldump.exe\" -u root -pmysql db_drawandchat_01 > \"H:\\DrawAndChatApp_db\\DrawAndChat_20230503_0134_03326.sql\"");
}
}
更新
根据我的经验
ProcessBuilder
使用 字符串数组作为参数
是更好的选择。
@注意:
@eg:: [将字符串命令转换为ProcessBuilder中的数组命令]
(以下代码在一些小修改后曾经工作过,但是没有测试)
public class T1 {
public static void main(String[] args) throws InterruptedException, IOException {
String cmdStr_loadFile = "cmd.exe /c cmd.exe /c "
+ "\"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysql.exe\" "
+ "-u root "
+ "-pmysql "
+ "--database db_drawandchat_02 "
+ "< "
+ "\"H:\\DrawAndChatApp_db\\DrawAndChat_test.sql\"";
ArrayList<String> cmdArr_loadFile = new ArrayList<>(Arrays.asList("cmd", "/c",
"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysql.exe",
"-u", "root",
"-pmysql",
"--database", "db_drawandchat_02",
"<",
"H:\\DrawAndChatApp_db\\DrawAndChat_test.sql"));
try {
ProcessBuilder processBuilder = new ProcessBuilder(cmdArr_loadFile);
processBuilder.redirectOutput(Redirect.INHERIT);
processBuilder.redirectError(Redirect.INHERIT);
Process process = processBuilder.start();
try {
process.waitFor(20, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new Error(e);
}
} catch (IOException e) {
throw new Error(e);
}
}
}
更新
在使用 >"a double cmd.exe /c cmd.exe /c
"
的情况下,使用 >"ProcessBuilder
with array of String as args
" 也是可行的。
特别是当你的路径中存在空格-- 可执行文件路径&&文件路径参数都包含空格时
@例如::
ArrayList<String> cmdArr_saveFile = new ArrayList<>(
Arrays.asList("cmd", "/c", "cmd", "/c",
"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysqldump.exe",
"-u", "root",
"-pmysql",
"db_drawandchat_01",
">",
"H:\\DrawAndChatApp_db\\DrawAndChat test2.sql"));