项目中碰到在linux系统中执行cmd命令,由于参数中带有空格,导致命令不能正确执行。一开始以为是'<'和‘“’需要转义,但是转义过后依然不能正确执行,后来发现发生命令执行错误的原因是因为参数中自带空格,导致命令的参数个数不能正确识别,所以尝试用String数组的形式传递参数,问题就解决了,而且不需要进行转义。在此记录一下。
1.以字符串方式传递参数
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* @author Hongyi Zheng
* @date 2018/12/4
*/
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
public static void exec(String cmd){
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
logger.error("process cmd error:" + e);
}
}
public static boolean isLinux(){
return System.getProperties().getProperty("os").toLowerCase().contains("linux");
}
public static void main(String[] args) {
StringBuilder cmd = new StringBuilder();
cmd.append("phantomjs ").append("D:\\js\\wkhtml2image.js ").append(" <table><thead><tr><th>000</th><th>001</th><th>002</th><th>003</th><th>004</th></tr></thead>\n" +
"<tbody><tr><td>101</td><td>102</td><td>103</td><td>104</td><td>105</td></tr></tbody></table>")
.append(" D:\\singleHtml\\20181205\\test_dom2img\\table3.html");
exec(cmd.toString());
}
}
2.以数组方式传递参数
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Arrays;
/**
* @author Hongyi Zheng
* @date 2018/12/4
*/
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
/**
* 以数组方式穿参
*
* @param cmdArr
*/
public static void exec(String[] cmdArr) {
logger.info("命令行执行:{}", Arrays.toString(cmdArr));
Runtime rt = Runtime.getRuntime();
try {
Process p = rt.exec(cmdArr);
if (p != null) {
processLog(p);
}
} catch (IOException e) {
logger.error("命令行IO异常,exception:", e);
}
}
private static void processLog(Process p) throws IOException {
if (p != null) {
try {
p.waitFor();
logger.info("命令执行日志 : {}", p.getInputStream());
} catch (InterruptedException e) {
logger.error("命令行执行中断:", e);
}
}
}
public static void main(String[] args) {
String[] cmdArr = new String[]{
"phantomjs",
"D:\\\\js\\\\wkhtml2image.js",
"<table><thead><tr><th>000</th><th>001</th><th>002</th><th>003</th><th>004</th></tr></thead><tbody><tr><td>101</td><td>102</td><td>103</td><td>104</td><td>105</td></tr></tbody></table>"
};
exec(cmdArr);
}
}
其实这里在输出cmd日志的时候,还会有一个错误流,信息流未正常读取导致堵塞的问题,这里先不讨论了,等不忙的时候把当时的解决方案贴过来。
有问题请评论区留言欢迎指正!~