2015-06-07 66 views
0

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

回答

0

在Windows cddir是shell命令,而不是系統的可執行文件(甚至在Linux上$EXEC("cd ./")失敗,出現相同的 「找不到文件」 的錯誤),但你可以用你的命令運行蝙蝠腳本:

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不以管理員身份。)

順便說一句,internally Nashorn uses好老java.lang.ProcessBuilder$EXEC,所以它的所有限制在這裏也適用。

+0

謝謝你的詳細解答。這是非常不幸的,因爲我將不得不爲每個我想在我的腳本中使用的shell命令準備一個'.bat'包裝器。 –

+1

那麼,如果你想保持它們之間的某種狀態(比如當前目錄),那麼它們將不會工作,因爲每個'$ EXEC'都有獨立的'上下文'。另外,對於單個或一小組命令,您可以像這樣調用'cmd':'$ EXEC('cmd/C「dir && cd C:\ && dir'')' – sainaen

+0

謝謝,我知道上下文在'$ EXEC's之間丟失,但絕對路徑可以存儲在javascript中並每次傳遞給命令行。我想不出任何其他國家會使用我的。 –