java - java在Tomcat中执行脚本
问题描述
我创建了一个 spring boot 项目,我在本地 tomcat 上运行(我打算将它部署到网络服务器)。在这个项目中,我创建了一个休息服务,它应该执行一个 .bat 文件。
我的休息服务看起来像这样(它们都不起作用)
@RequestMapping(value = "/esc", method= RequestMethod.GET)
public String esc() throws IOException, InterruptedException {
String folder = "P:\\Documents\\testcmd";
String[] cmdarray = new String[]{"cmd -c","dosomething.cmd"};
ProcessBuilder processBuilder = new ProcessBuilder( cmdarray );
processBuilder.directory(new File(folder));
Process process = processBuilder.start();
int exitCode = -1;
boolean finished = false;
while ( !finished ) {
exitCode = process.waitFor();
finished = true;
}
return folder;
}
@RequestMapping(value = "/ex", method= RequestMethod.GET)
public String executeShellScript(){
//final String shCmd = "/bin/bash -c helloworld.sh";
System.out.println("Working Directory = " +
System.getProperty("user.dir"));
final String shCmd = "cmd -c P:/Documents/testcmd/dosomething.cmd";
String output = executeCommand(shCmd);
return output;
}
private String executeCommand(String command){
Process p;
InputStream in = null;
String value = "";
try {
p = Runtime.getRuntime().exec(command);
in = p.getInputStream();
int ch;
while((ch = in.read()) != -1) {
value = String.valueOf((char)ch);
}
}catch (IOException e){
e.printStackTrace();
}
return value;
}
我使用 processbuilder 和运行时进行了尝试。我要执行的文件在这个文件夹中:“P:\Documents\testcmd”
甚至可以使用 tomcat 服务器执行本地文件吗?
解决方案
我解决了这个问题。解决方案Runtime.getRuntime().exec(command)
是正确的。只有我的系统调用是错误的。而不是final String shCmd = "cmd -c P:/Documents/testcmd/dosomething.cmd";
我不得不使用"P:/Documents/testcmd/dosomething.cmd"
. 另外我不得不改变,dosomething.cmd
因为它是错误的。执行纯 java 代码时,该文件将打开一个 cmd 终端,然后在无限循环中打印 hello。我更改了文件内容,而不是终端中的无限循环,它将 hello 打印到另一个文件中。
// method is mapped on root/ex
@RequestMapping(value = "/ex", method= RequestMethod.GET)
public String executeShellScript(){
System.out.println("Working Directory = " +
System.getProperty("user.dir"));
final String shCmd = "P:\\Documents\\testcmd\\dosomething.cmd -c";
String output = executeCommand(shCmd);
return output;
}
之前和之后的批处理文件
@echo off
:start
echo hallo
pause
goto start
后
@echo off
@echo This is a test>> P:/Documents/testcmd/file.txt
@echo 123>> P:/Documents/testcmd/file.txt
@echo 245.67>> P:/Documents/testcmd/file.txt
推荐阅读
- android - 在 Flutter 中,如何在原生文件资源管理器中为用户打开一个文件夹,以便用户浏览其文件/文件夹
- javascript - 如何将自定义集数据传递给 src 图像“onClick”?
- css - 如何仅使用 xml 代码在 odoo 中调整二进制(64)图像的大小?(最大高度)
- java - 使用 JNDI 获取 WebSphere 完整服务器名称
- pytorch - 将 torch.nn.CrossEntropyLoss 与 label as int 和 prob 张量进行比较会产生错误
- ssh - SSH 代理转发不适用于所有 SSH 目标机器
- javascript - 从日期范围值生成新的输入字段
- numpy - 我不能用单应矩阵逆变换得到相同的点
- php - 当 $this 在 laravel 刀片模板中使用时,它指的是什么对象?
- javascript - Google Script API 理解