我想在Windows下使用javascript(特別是nashorn)進行命令行腳本編寫。通過命令行腳本,我的意思是使用JavaScript而不是.bat文件來執行各種命令行工具並處理它們的輸出。一個正式的例子是here at oracle。在windows上使用JavaScript(nashorn)命令行腳本
在那裏,他們展示瞭如何可以從.js
文件內$EXEC("ls -l")
執行shell命令和輸出可以在$OUT
和$ERR
進行訪問,如果你有
jjs script.js -scripting -- params
運行它。我做了大量的谷歌搜索,並沒有提及任何地方(甲骨文和第三方博客文章,SO等),這是不支持在Windows上,但不知何故,所有的例子是與bash
命令。 這甚至可能在Windows上?
所以我可以在.js
腳本中編寫例如。 $EXEC("dir")
並處理來自$OUT
的輸出?
我有多遠了:
如果腳本打
$EXEC
命令時,我不使用-scripting
參數有關jjs
,我只是得到ReferenceError: "$EXEC" is not defined
所以這可能不是要走的路。如果我確實使用
-scripting
param,$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
謝謝你的詳細解答。這是非常不幸的,因爲我將不得不爲每個我想在我的腳本中使用的shell命令準備一個'.bat'包裝器。 –
那麼,如果你想保持它們之間的某種狀態(比如當前目錄),那麼它們將不會工作,因爲每個'$ EXEC'都有獨立的'上下文'。另外,對於單個或一小組命令,您可以像這樣調用'cmd':'$ EXEC('cmd/C「dir && cd C:\ && dir'')' – sainaen
謝謝,我知道上下文在'$ EXEC's之間丟失,但絕對路徑可以存儲在javascript中並每次傳遞給命令行。我想不出任何其他國家會使用我的。 –