在Windows上使用javascript(nashorn)命令行脚本

时间:2015-06-07 17:05:12

标签: javascript windows shell nashorn

我想在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

1 个答案:

答案 0 :(得分:0)

在Windows上cddir是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,所以它的所有限制都适用于此。