JSP文件中执行CMD命令报Syntax error on tokens错误如何解决
报错场景
在JSP文件中编写Java代码调用CMD执行系统计划任务查询命令时,触发编译错误:Syntax error on tokens, delete these tokens
原问题代码如下:
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);
错误原因
- 字符串语法不符合Java规范:Java字符串中,反斜杠
\是转义起始符,直接写单斜杠会被识别为非法转义序列;同时字符串内部嵌套的双引号没有做转义,会直接截断字符串边界,编译器无法识别剩余零散字符,就会抛出token语法错误。 - 命令内容存在无效字符:命令开头的
C:\Users\me>是CMD命令行的提示符内容,不属于命令本身的组成部分,属于复制命令时误带入的冗余内容。 - 执行逻辑存在缺陷:
Runtime.exec()不会自动调用CMD shell解释命令,代码中用到的管道|、输出重定向>是CMD shell专属语法,就算字符串语法修正后直接执行,这些语法也不会生效,命令无法达到预期效果。
修复方案
- 修正字符串转义:所有Windows路径中的反斜杠统一替换为双反斜杠
\\,字符串内部的嵌套双引号前加反斜杠转义为\",同时删除命令开头冗余的CMD提示符内容。 - 调整命令调用逻辑:在命令最前面添加
cmd /c前缀,显式调用CMD解释器来执行整条带管道、重定向的命令,保证shell语法可以正常解析。
修复后可正常运行的代码如下:
String runtimecmd = "cmd /c 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); // 如需等待命令执行完成后再做后续逻辑,可添加下行代码 p.waitFor();
补充说明:JSP运行依赖Web容器(如Tomcat)的服务账号权限,如果命令执行后未在目标路径生成输出文件,优先检查容器服务账号是否有计划任务查询权限、以及对目标桌面路径的写入权限,排除权限拦截问题。
内容的提问来源于stack exchange,提问作者Mainaqisyah
相关产品推荐
相关产品推荐

