一、问题
Ruoyi架构,bat文件上传到了服务器的文件夹upload下,如何通过在前端点击“执行”,后端Java去操控对应的bat文件执行呢?
Java可以通过Process类的Runtime.getRuntime().exec调用外部的脚本或者是操作系统命令
二、工具介绍
Runtime.getRuntime().exec() 方法,相当于在当前目录打开CMD窗口,而打开后需要执行的命令可以
如果执行Runtime.getRuntime().exec("notepad.exe") 相当于以下效果:
 
 cmd /c start 命令可以打开一个新的命令提示符窗口,并在其中执行指定的命令或程序,但打开新窗口的根路径在当前目录,可以在命令中使用 cd 命令来切换路径
参数 /c 表示,这个cmd一旦被调用,程序不用等待cmd后面的内容执行完毕,就返回到调用start的环境里,这样可以避免如果cmd后面的内容运行过长而导致程序处于等待而呈现假死的现象。
例如cmd /c start 测试脚本程序.bat相当于打开一个新窗口执行bat程序

/K 参数表示在命令执行完毕后不关闭窗口,cd 命令用于切换路径。可以将 C:\path\to\directory 替换为你想要设置的路径,然后在 cmd /c start 命令中使用该命令即可。
例如,以下命令可以打开一个新的命令提示符窗口,并将其根路径设置为 C:\path\to\directory:
cmd /c start cmd.exe /K "cd C:\path\to\directory"
三、解决方法
首先我们创建一个脚本测试程序

将其通过前端上传到服务器上
 

由于Ruoyi默认上传文件时,会以profile+年/月/日/标识符的方式放入对应文件夹,我们可以看到文件目录

 由于Runtime.getRuntime().exec() 可以传入字符串或者字符串数组,执行字符串中的CMD命令,但前提是,我们需要找到文件目录和文件名
先设置common目录
            filePath = filePath.substring(filePath.indexOf("profile"));
            //处理filePath,将profile替换为RuoYiConfig.getProfile()
            filePath = filePath.replace("profile", RuoYiConfig.getProfile());
            //处理filePath,将/替换为\
            filePath = filePath.replace("/", "\\");
            //设置common为filePath目录最后一个\之前的部分
            String common = filePath.substring(0, filePath.lastIndexOf("\\"));
			 //进入common目录后,执行filePath
            File file = new File(filePath);
            String cmd = "cmd /c start cmd.exe /K \"cd /d " + common + " && " + file.getAbsolutePath() + "\"";
            Process process = Runtime.getRuntime().exec(cmd);
这个命令会打开一个新的命令提示符窗口,然后进入common目录,也就是E:\ftpTest\upload\2023\07\27并执行运行文件命令。请注意,如果您的文件路径中包含空格或其他特殊字符,您可能需要使用引号将其括起来,例如:
String cmd = "cmd /c start cmd.exe /K \"cd /d " + common + " && " + file.getAbsolutePath() + "\"";
String cmd = "cmd /c start cmd.exe /K \"cd /d " + common + " && \"" + file.getAbsolutePath() + "\"\"";

在Java中,可以使用Process类来执行命令,并通过waitFor()方法等待命令执行完成。waitFor()方法返回一个整数值,表示命令的执行结果。通常情况下,waitFor()方法返回0表示命令执行成功,返回非0值表示命令执行失败。可以使用以下代码示例来实现该功能:
import java.io.IOException;
public class CommandExecutor {
    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("cmd /c start cmd.exe");
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                System.out.println("Command executed successfully.");
            } else {
                System.out.println("Command execution failed.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
在上面的代码中,我们使用Runtime.getRuntime().exec()方法执行cmd /c start cmd.exe命令,并通过process.waitFor()方法等待命令执行完成。最后,我们根据waitFor()方法的返回值来判断命令是否执行成功。
之后,前端点击执行后,服务器端将运行对应的bat文件


![RuoYi-Vue 部署与配置 [CentOS7]](https://img-blog.csdnimg.cn/21837bbcf8d848baa0077314345d920b.png#pic_center)
















