2

我正在尝试从 Fantom 进程调用风扇命令。这是它从 Fantom 运行的错误,它从命令行正确运行。你认为问题可能是什么?

class Main {
   Void main() {
       buf := Buf()

       Process() {
          command = ["fan <pod>::<type>.<method>"]
          out = buf.out 
       }.run.join

       outStr := buf.flip.readAllStr
    }   
}  

这是我得到的错误:

sys::IOErr: java.io.IOException: Cannot run program "fan <pod>::<type>.<method>": 
CreateProcess error=2, The system cannot find the file specified
  java.lang.ProcessBuilder.start (Unknown)
  fan.sys.Process.run (Process.java:141)
  PDFCommandLine::Main.main (Main.fan:10)
  java.lang.reflect.Method.invoke (Unknown)
  fan.sys.Method.invoke (Method.java:559)
  fan.sys.Method$MethodFunc.callOn (Method.java:230)
  fan.sys.Method.callOn (Method.java:139)
  fanx.tools.Fan.callMain (Fan.java:185)
  fanx.tools.Fan.executeType (Fan.java:147)
  fanx.tools.Fan.execute (Fan.java:41)
  fanx.tools.Fan.run (Fan.java:308)
  fanx.tools.Fan.main (Fan.java:346)
4

1 回答 1

2

我认为问题在于没有调用 Windows 文件fan,只有fan.bat

只有 Windows 命令提示符会插入fan和查找可执行扩展名、.com.bat.cmd.exe等...

BedSheet代理的注意经验告诉我,新的fan.batJava 在单独的进程中启动,批处理文件立即完成;Process因此,即使 Fantom 程序成功运行,您实际上也不会收到该类的任何输出。

相反,您需要编写一个自己启动 Java 进程的命令。就像是:

C:\> java -cp %FAN_HOME%\lib\java\sys.jar fanx.tools.Fan <pod>::<type>.<method>

这是一个以跨平台方式执行此操作的小片段:

static Process fanProcess(Str[] cmd) {
    homeDir   := Env.cur.homeDir.normalize
    classpath := (homeDir + `lib/java/sys.jar`).osPath
    args      := ["java", "-cp", classpath, "-Dfan.home=${homeDir.osPath}", "fanx.tools.Fan"].addAll(cmd)
    return Process(args)
}

你可以这样使用:

buf := Buf()
fanProcess(["<pod>::<type>.<method>", "arg1", "arg2"]) {
    out = buf.out 
}.run.join
outStr := buf.flip.readAllStr

请注意,以上要求java必须在您的PATH.

于 2016-12-12T19:32:14.367 回答