来自 Fantom 进程的风扇命令失败
Fan command from a Fantom process Failing
我正在尝试从 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)
我认为问题在于没有名为 fan
的 Windows 文件,只有 fan.bat
!
只有Windows命令提示符插入fan
并查找可执行扩展,.com
、.bat
、.cmd
、.exe
, 等等...
注意 BedSheet 代理的经验告诉我,新的 fan.bat
在单独的进程中启动 Java 并且批处理文件会立即完成;所以你实际上并没有从 Process
class 收到任何输出,即使 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
上。
我正在尝试从 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)
我认为问题在于没有名为 fan
的 Windows 文件,只有 fan.bat
!
只有Windows命令提示符插入fan
并查找可执行扩展,.com
、.bat
、.cmd
、.exe
, 等等...
注意 BedSheet 代理的经验告诉我,新的 fan.bat
在单独的进程中启动 Java 并且批处理文件会立即完成;所以你实际上并没有从 Process
class 收到任何输出,即使 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
上。