首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过JSP文件执行CMD命令

通过JSP文件执行CMD命令
EN

Stack Overflow用户
提问于 2022-06-10 05:18:43
回答 1查看 278关注 0票数 0

我试图通过JSP文件执行CMD命令,但是它会发出错误:令牌上的语法错误,删除这些标记

代码语言:javascript
运行
复制
String runtimecmd = "C:\\Users\\me>schtasks.exe /query /tn "\\dummy\\file" /v /fo list | find "Last Run Time:" > C:\\Users\\me\\Desktop\\lastRunTime.txt";
System.out.println(runtimecmd);
Process p = Runtime.getRuntime().exec(runtimecmd);

我不知道如何破译这个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-10 08:28:56

方法exec (在类java.lang.Runtime中)并不等同于命令提示符窗口。方法参数是希望运行的可执行文件的名称(在您的示例中是分批 )以及该命令所需的任何选项。同样,在您的示例中,命令选项是:

代码语言:javascript
运行
复制
/query /tn "\\dummy\\file" /v /fo list

但是,正如类java.lang.Process的javadoc中所述

从1.5开始,ProcessBuilder.start()是创建Process的首选方法。

因此,您应该使用类java.lang.ProcessBuilder

另外,由于您是从Java代码启动命令,所以您应该使用Java代码来处理schtasks命令的输出。

下面的代码是一个独立的控制台应用程序,演示如何执行schtasks、从命令输出中定位Last Run Time行并将该行保存在文件中。

注意,如果文件schtasks.exe不在System属性java.library.path的任何文件夹中,那么您需要为schtasks.exe提供完整的路径。

(代码之后还有更多注释。)

代码语言:javascript
运行
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;

public class SchTasks {

    public static void main(String args[]) {
        ProcessBuilder pb = new ProcessBuilder("schtasks.exe",
                                               "/QUERY",
                                               "/FO",
                                               "LIST",
                                               "/V",
                                               "/TN",
                                               "\\dummy\\file");
        String result = null;
        try {
            Process p = pb.start(); // throws java.io.IOException
            BufferedReader out = p.inputReader();
            String output = out.readLine();
            while (output != null) {
                if (output.startsWith("Last Run Time:")) {
                    result = output;
                }
                output = out.readLine();
            }
            int status = p.waitFor(); // throws java.lang.InterruptedException
            if (status == 0  &&  result != null) {
                try (PrintWriter pw = new PrintWriter("C:\\Users\\me\\Desktop\\lastRunTime.txt")) {
                    pw.println(result);
                }
            }
        }
        catch (InterruptedException | IOException x) {
            x.printStackTrace();
        }
    }
}
  • 方法inputReader被添加到JDK 17中的类Process中,因此如果您使用的是早期版本,则可以使用方法getInputStream

以下是我运行上述代码后文件lastRunTime.txt的内容。

代码语言:javascript
运行
复制
Last Run Time:                        30/11/1999 00:00:00

我假设您实际上需要使用实际的最后一个运行时(任务\\dummy\\file)来做一些事情,所以您可以将它转换成一个时间戳,而不是保存到一个文件中。下面的代码替换了上述代码中将结果保存到文件中的部分。

代码语言:javascript
运行
复制
if (status == 0  &&  result != null) {
    String[] parts = result.split(":\\s{2,}", 2);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss",
                                                              Locale.ENGLISH);
    LocalDateTime lastRunTime = LocalDateTime.parse(parts[1], formatter);
    System.out.println("Last Run Time: " + lastRunTime);
}

请参阅以下内容:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72569394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档