我试图通过JSP文件执行CMD命令,但是它会发出错误:令牌上的语法错误,删除这些标记
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);
我不知道如何破译这个错误。
发布于 2022-06-10 08:28:56
方法exec
(在类java.lang.Runtime
中)并不等同于命令提示符窗口。方法参数是希望运行的可执行文件的名称(在您的示例中是分批 )以及该命令所需的任何选项。同样,在您的示例中,命令选项是:
/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
提供完整的路径。
(代码之后还有更多注释。)
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
的内容。
Last Run Time: 30/11/1999 00:00:00
我假设您实际上需要使用实际的最后一个运行时(任务\\dummy\\file
)来做一些事情,所以您可以将它转换成一个时间戳,而不是保存到一个文件中。下面的代码替换了上述代码中将结果保存到文件中的部分。
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);
}
请参阅以下内容:
https://stackoverflow.com/questions/72569394
复制相似问题