Java 使用Runtime.getRuntime().exec(命令)时用户对命令行的输入;
我认为这是不可能的,但我一直在使用:Java 使用Runtime.getRuntime().exec(命令)时用户对命令行的输入;,java,command-line,execute,Java,Command Line,Execute,我认为这是不可能的,但我一直在使用: Process p = Runtime.getRuntime().exec(command); 在命令行上运行命令,但现在我遇到了这样一种情况:我正在运行的命令需要一些用户输入,例如用户名 这不能通过正在执行的命令的参数来解决,是否有任何方法可以将用户名传递给同一命令行实例并继续 ---编辑--- 我还是不能让它工作。以下是命令行中的步骤: C:\someProgram.exe Login: Passowrd: 因此,我需要在运行时提示时传递登录名和密码
Process p = Runtime.getRuntime().exec(command);
在命令行上运行命令,但现在我遇到了这样一种情况:我正在运行的命令需要一些用户输入,例如用户名
这不能通过正在执行的命令的参数来解决,是否有任何方法可以将用户名传递给同一命令行实例并继续
---编辑---
我还是不能让它工作。以下是命令行中的步骤:
C:\someProgram.exe
Login:
Passowrd:
因此,我需要在运行时提示时传递登录名和密码。我得到的代码不起作用:
try {
String CMD = "\"C:\\someProgram\"";
Scanner scan = new Scanner(System.in);
ProcessBuilder builder = new ProcessBuilder(CMD);
builder.redirectErrorStream(true);
Process process = builder.start();
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader (new InputStreamReader(is));
OutputStream out = process.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
String line;
try {
while (scan.hasNext()) {
String input = scan.nextLine();
if (input.toLowerCase().startsWith("login")) {
writer.write("myUsername");
} else if(input.toLowerCase().startsWith("password")){
writer.write("myPassword");
}
writer.flush();
line = reader.readLine();
while (line != null) {
System.out.println ("Stdout: " + line);
line = reader.readLine();
}
if (line == null) {
break;
}
}
process.waitFor();
}
finally {;
writer.close();
reader.close();
}
}
catch (Exception err) {
System.err.println("some message");
}
我试过这样的方法:
writer.write(“myUsername\n”)
如果有任何帮助,我可以看到someProgram.exe被调用并在进程中运行,但它只是挂起。只需写入p.getOutputStream()。这会将用户名发送到流程的标准输入,该输入应该满足您的要求
out = p.getOutputStream();
out.write("fooUsername\n".getBytes());
out.flush();
您应该重定向命令输入并将参数发送到那里。使用
process.setInputStream()
,写入此流。作为命令
字符串的一部分,如果您在Unix/Linux/OSX上运行,或者在PowerShell上运行,您可以预先编写cat
shell命令,让shell将文件的内容转储到输入流中,以便您预期的可执行文件作为输入读取
类似于cat user_input.txt | myAppWantsInput.pl
的命令
这将获取user_input.txt
的内容,并将其转储到标准输入中,因此当执行命令中的“myAppWantsInput.pl”并从标准输入中读取时,它将读取文件的内容并将其作为输入,就像从键盘输入一样
当然,如果事先不知道要传递什么值,可以在调用命令之前动态生成所需的文件。如果在运行命令之前无法确定所有需要的输入,则此操作将无效。是否检查了Process
是否有任何方法可以执行此操作?是的,例如Process#getOutputStream():)没有进程。setInputStream()我想他想将输入发送到进程实例,不是运行它的Java虚拟机。@javawizard由于某种原因,我假设他的命令正在启动另一个Java应用程序,我已经更新了我的答案,使之更一般。无论命令的可执行文件是如何实现的,我的方法都应该有效。