无法使用java将命令写入共享位置上的exe程序
我在共享位置上放置了一个exe程序。它在启动时不接受任何参数。当它在命令窗口中启动时,它会显示一个帮助菜单,其中包含可以使用它执行的命令列表,并以需要输入命令的无法使用java将命令写入共享位置上的exe程序,java,exe,runtime.exec,Java,Exe,Runtime.exec,我在共享位置上放置了一个exe程序。它在启动时不接受任何参数。当它在命令窗口中启动时,它会显示一个帮助菜单,其中包含可以使用它执行的命令列表,并以需要输入命令的结束。我需要从该列表中执行一个名为TRIGGER的特定命令。到目前为止,这是我所知道的,但它完全失败了。它既不显示进程的输出,也不从流中获取输入命令trigger public void execute(){ String cmd = "\\\\sharedLocation\\server\\adm.exe"; p =
结束。我需要从该列表中执行一个名为TRIGGER
的特定命令。到目前为止,这是我所知道的,但它完全失败了。它既不显示进程的输出,也不从流中获取输入命令trigger
public void execute(){
String cmd = "\\\\sharedLocation\\server\\adm.exe";
p = Runtime.getRuntime().exec(cmd);
InputStream in = p.getInputStream();
OutputStream out = p.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write("TRIGGER");
bw.flush();
String output = "";
while (!output.endsWith(">")) {
System.out.println("in loop");
output = output + br.readLine();
}
System.out.println("Out"+output);
out.close();
p.waitFor();
}
编辑:adm.exe由该程序启动,但adm.exe似乎是一个阻塞进程。它无法在“in-loop”语句中打印。但是,当我打开windows任务管理器并杀死adm.exe进程树时,控制台上会显示此消息
in loopnull
in loopnullnull
in loopnullnullnull
in loopnullnullnullnull
in loopnullnullnullnullnull
in loopnullnullnullnullnullnull
in loopnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
Outnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
不确定,但是
定时
我知道您的execute方法在等待一些输出和它的终结时被阻塞在。它不会来,直到你发送触发器
我会尽力
在之前发送触发器(您不会丢失任何数据,它会得到缓冲)
在方法末尾,使用p.waitFor()
避免在p完成之前退出(无论如何,while会这样做)
编辑
您的adm.exe是否需要使用UTF-16编写触发器?因为如果您使用getBytes()
,这就是您要发送的内容。如果您需要其他编码(如UTF-8或ASCII),请通过示例尝试使用getBytes(“UTF-8”)
样本
我应该这样做:
public void execute() {
String cmd = "\\\\sharedLocation\\server\\adm.exe";
Process p = Runtime.getRuntime().exec(cmd);
// send TRIGGER before everything (I can't consume the response if I don't ask for it first)
OutputStream out = p.getOutputStream();
out.write("TRIGGER".getBytes());
out.flush(); // flush to ensure it's sent, but don't close...
InputStream in = p.getInputStream();
String output = "";
int c = 0;
while (!output.endsWith(">")){
c = in.read(); // you've eaten this when modified your code
output+= (char)c; // I should change the way bytes convert to char, but that's another story
}
System.out.println(output);
// optional: if I want to wait for p to finish
p.waitFor();
}
一些一般性意见:
不要使用Process
,而是使用ProcessBuilder
。如果您想做比启动外部流程更复杂的事情,请使用
如果只在命令行中键入TRIGGER
,而不按Return,会发生什么情况?如果什么也没发生,也按return from Java:Wrapout
在PrintStream
中,并使用pw.println(“触发器”)
由于您没有得到任何输出,可能命令会注意到它不是从命令提示符启动的,并且行为不同?如果是这种情况,请使用cmd/c\\\\sharedLocation\\server\\adm.exe运行它
始终使用列表/数组提供命令参数,以避免特殊字符出现问题
是的,你是对的。我已经改变了条件一段时间了,但奇怪的是它仍然没有像你说的那样执行循环。猜猜为什么?我不是在抱怨这种情况,而是在发送触发器之前放置了while。我举个例子……我添加了一个细节:使用flush
notclose
和。。。adm.exe只需要触发器
?它不需要触发器\n
,触发器\r\n
或什么吗?也许是在读台词……为什么不使用expectj来完成这些任务呢?这会容易得多?你需要读字符,不是吗?(in.read()…)最终flush
bw。否则,它将缓冲触发器。事实上,我不应该使用BufferedWriter。我只是个作家。