之前想着在windows下和linux下调用一些python Scrapy的接口,发现路径问题,传参数问题都挺麻烦,遂改为在bat文件和shell中具体写方法,然后执行他们就好了
bat处理文件中可引用的参数为%0~%9,%0是指批处理文件的本身,也可以说是一个外部命令;%1~%9是批处理参数,也称形参,例如:新建一个文件test.bat,文件内容如下:
@echo off
echo param[0] = %0
echo param[1] = %1
echo param[2] = %2
echo param[3] = %3
echo param[4] = %4
echo param[5] = %5
echo ...
pause
调用时只需要在执行bat文件后加上参数即可,记得参数间有空格
test_argv.bat 1 game test what
此时输出:
param[0] = test_argv.bat
param[1] = 1
param[2] = game
param[3] = test
param[4] = what
param[5] =
…
请按任意键继续…
最简单的调用
Runtime.getRuntime().exec("D:\\aaa\\remoteDesktop\\remoteConnection.bat");
这样调用是不会有回显的,如果你需要看到返回结果,就需要这样:
try {
// 执行ping命令
Process process = Runtime.getRuntime().exec("cmd /c e:&dir");
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
注意到了吗,这次的exec函数不是简单的选择bat文件的路径,多了“cmd /c” 这个前缀有以下使用方式:
cmd /c dir 是执行完dir命令后关闭命令窗口。
cmd /k dir 是执行完dir命令后不关闭命令窗口。
cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。
cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
注意:第二个调用方式在bat的输出内容过长时,会卡死!!!T_T
网上的解释说“因为本地进程输入输出缓存有限,你不快点读取的话Process就挂在那了。”
所以需要开一个进程去不断的取数据,具体实现方式见
https://blog.csdn.net/aerchi/article/details/7669215
这个我没有检测,因为我发现,如果bat输出的内容过长时,使用第一种方式,不会卡死,若是想看到输出 可以加前缀cmd /k start
,若是想把输出存起来 就加上后缀 >>1.txt
,就好了,毕竟还要开线程太繁琐。
shell脚本传入参数与bat基本一致,只不过形参变成了 1, 1 , 2,$3…..
例如:
脚本test.sh的内容如下:
name=$1
echo "the ${name} are great man!"
执行./test.sh Xiao Ming
命令,可以看到自己编写脚本的结果
the Xiao Ming are great man!
linux环境果然友好得多,封装好了以下代码,传入shell文件的路径就好了
public static String linuxShellexec(String shellPath) {
String result="";
try {
Process ps = Runtime.getRuntime().exec(shellPath);
ps.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
result = sb.toString();
}
catch (Exception e) {
e.printStackTrace();
result="linux下运行完毕";
}
return result;
}
参考:
https://www.cnblogs.com/happyPawpaw/p/3740903.html
https://www.cnblogs.com/abel-hefei/p/7284256.html
https://blog.csdn.net/a1010256340/article/details/76187353
https://blog.csdn.net/zyf_balance/article/details/51692065
https://blog.csdn.net/aerchi/article/details/7669215