我想在Windows下使用javascript(特别是nashorn)进行命令行脚本编写。通过命令行脚本我的意思是使用javascript而不是.bat文件,用于执行各种命令行实用程序并处理它们的输出。一个官方的例子是here at oracle。
在那里,他们展示了如何使用.js
在$EXEC("ls -l")
文件中执行shell命令,如果运行它,可以在$OUT
和$ERR
中访问输出与
jjs script.js -scripting -- params
。我做了很多谷歌搜索,并没有在任何地方提到(oracle和第三方博客帖子,SO等),这在Windows上是不受支持的,但不知何故,所有的例子使用bash
命令。 这在Windows上是否可行?
所以我可以用.js
脚本编写例如。 $EXEC("dir")
并处理$OUT
的输出?
我走了多远:
如果我没有将-scripting
参数用于jjs
,当脚本点击$EXEC
命令时,我只需获取ReferenceError: "$EXEC" is not defined
所以这样可能不是那种方式。
如果我使用-scripting
参数,$EXEC("cd c:")
会抛出以下异常。这表明我可能以错误的方式调用命令,或者没有正确设置路径或某些东西。
我在这里缺少什么?任何想法都表示赞赏。
环境详情:
赢取8.1
Java 8,jjs
(bin)的路径在系统的环境变量中正确设置。
例外:
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Cannot run program "cd": CreateProcess error=2, The system cannot find the file specified
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:382)
at jdk.nashorn.tools.Shell.apply(Shell.java:383)
at jdk.nashorn.tools.Shell.runScripts(Shell.java:312)
at jdk.nashorn.tools.Shell.run(Shell.java:168)
at jdk.nashorn.tools.Shell.main(Shell.java:132)
at jdk.nashorn.tools.Shell.main(Shell.java:111)
Caused by: java.io.IOException: Cannot run program "cd": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at jdk.nashorn.internal.runtime.ScriptingFunctions.exec(ScriptingFunctions.java:166)
at jdk.nashorn.internal.scripts.Script$test01.runScript(test01.js:8)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:535)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:209)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378)
... 5 more
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
at java.lang.ProcessImpl.start(ProcessImpl.java:137)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 10 more
答案 0 :(得分:0)
在Windows上cd
和dir
是shell命令,而不是系统可执行文件(即使在Linux $EXEC("cd ./")
上也失败了#34;找不到文件&#34;错误) ,但您可以使用命令运行bat脚本:
当test.bat
包含
cd C:\Users
pwd
jjs
评估
$EXEC("./test.bat")
将打印
Volume in drive C has no label.
Volume Serial Number is ...
Directory of C:\Users
...
或调用一些非交互式可执行文件,例如label
$EXEC("label C:System")
(它只是我在system32
文件夹中发现的第一个非交互式内容;可能由于权限不足而失败,假设您正在运行jjs
不是管理员。)
顺便说一句$EXEC
internally Nashorn uses NSData
NSData
,所以它的所有限制都适用于此。