Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中写入命令提示符?_Java_Command Line_Command Prompt - Fatal编程技术网

如何在Java中写入命令提示符?

如何在Java中写入命令提示符?,java,command-line,command-prompt,Java,Command Line,Command Prompt,背景 我从Java应用程序启动了一个命令提示符。现在我想将命令输入到刚刚生成的命令提示符中。如何在Java程序刚刚生成的提示符中运行命令 我尝试过的 我的代码创建了一个启动命令提示符的进程。然后它获取进程的OutputStream来尝试写入它。但我没有看到任何变化。它应该只更改目录,然后在新目录中运行一系列命令 // Block that makes new command prompt List<String> commands = new ArrayList<String&

背景

我从Java应用程序启动了一个命令提示符。现在我想将命令输入到刚刚生成的命令提示符中。如何在Java程序刚刚生成的提示符中运行命令

我尝试过的

我的代码创建了一个启动命令提示符的进程。然后它获取进程的OutputStream来尝试写入它。但我没有看到任何变化。它应该只更改目录,然后在新目录中运行一系列命令

// Block that makes new command prompt
List<String> commands = new ArrayList<String>();
commands.add("cmd.exe");
commands.add("/c");
commands.add("start");
commands.add("cmd.exe");

// Block that creates a writer to write to new command prompt
ProcessBuilder pb = new ProcessBuilder(commands);
Process p = pb.start();
OutputStream os = p.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os)); 

// Block that actually writes the commands
writer.write(String.format("cd %s\n", PATH);
writer.write(OTHER_COMMANDS); // I'm ommiting the other commands because there's a lot
writer.flush();
writer.close();
//生成新命令提示的块
List命令=new ArrayList();
commands.add(“cmd.exe”);
命令。添加(“/c”);
命令。添加(“开始”);
commands.add(“cmd.exe”);
//创建写入程序以写入新命令提示符的块
ProcessBuilder pb=新的ProcessBuilder(命令);
进程p=pb.start();
OutputStream os=p.getOutputStream();
BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(os));
//实际写入命令的块
writer.write(String.format(“cd%s\n”,路径);
writer.write(其他_命令);//我正在使用其他命令,因为有很多
writer.flush();
writer.close();

我不确定为什么命令没有写入弹出的命令提示符。我看到一个新的命令提示符弹出,但目录从它开始的地方没有改变。我如何将命令输入到生成的提示符中?

您的程序ProcessBuilder允许您访问进程cmd.exe的stdin、stdout和stderr。这些与程序cmd.exe打开的窗口和命令提示符的输入和输出不同

关于如何使用c#,这里有一个答案:


在Java中,我不知道有类似的API,实际上可能需要使用JNI或JNA才能访问您需要使用的Windows API这是一种方法,但是如果您选择使用JNI或JNA,那么关于如何使用JNI或JNA的完整描述不在这里的答案范围之内。

您的程序ProcessBuilder允许您访问进程cmd.exe的stdin、stdout和stderr。这与ngs作为程序cmd.exe打开的窗口和命令提示符的输入和输出

关于如何使用c#,这里有一个答案:


在Java中,我不知道有类似的API,实际上可能需要使用JNI或JNA才能访问您需要使用的Windows API与另一个答案中的引用相同。因此,这是一种方法,但是如果您选择使用JNI或JNA,那么关于如何使用JNI或JNA的完整描述不在这里的答案范围内。

当您写入
p
时,您正在写入此命令的标准输入:

cmd.exe /c start cmd.exe
您正在写入第一个
cmd.exe
。该命令除了启动第二个之外,什么都不做。不可能(至少不简单)获得第二个进程的句柄。您可以使用
/K
,并将命令与
&
合并在一起。例如:

commands.add("/K");
commands.add(String.join(" && ", OTHER_COMMANDS_AS_LIST));

当您写入
p
时,您正在写入此命令的标准输入:

cmd.exe /c start cmd.exe
您正在写入第一个
cmd.exe
。该命令除了启动第二个之外,什么都不做。不可能(至少不简单)获得第二个进程的句柄。您可以使用
/K
,并将命令与
&
合并在一起。例如:

commands.add("/K");
commands.add(String.join(" && ", OTHER_COMMANDS_AS_LIST));

就我所见,您正在尝试实现一种与远程shell(没有网络和加密的SSH)大致相似的东西

这应该像您期望的*nix类shell一样工作,因为这些shell正确地处理它们的标准输入和输出,这正是因为它们需要重定向(通过网络或其他方式)

Windows cmd.exe实际上不是一个纯shell。它是一个终端仿真器(屏幕上显示的黑色窗口)shell,在一个进程中。这就是为什么它不从stdin获取输入,也不在stdout上打印输出。相反,它侦听GUI键盘事件进行输入并在内部处理,输出直接显示在窗口中,而不将其写入stdout

这就是为什么没有简单的方法“远程控制”cmd.exe的原因。它只是不适合于此。 您可以使用“适当”的shell来尝试这一点,比如Cygwin'ed bash.exe,或者PowerShell,或者类似的


事实上,令人惊讶的是,大约20年前作为一个快速脏“DOS窗口”创建的cmd.exe至今仍然存在,并且实际用于生产工作…

据我所知,您正试图实现与远程shell(没有网络和加密的SSH)类似的东西

这应该像您期望的*nix类shell一样工作,因为这些shell正确地处理它们的标准输入和输出,这正是因为它们需要重定向(通过网络或其他方式)

Windows cmd.exe实际上不是一个纯shell。它是一个终端仿真器(屏幕上显示的黑色窗口)shell,在一个进程中。这就是为什么它不从stdin获取输入,也不在stdout上打印输出。相反,它侦听GUI键盘事件进行输入并在内部处理,输出直接显示在窗口中,而不将其写入stdout

这就是为什么没有简单的方法“远程控制”cmd.exe的原因。它只是不适合于此。 您可以使用“适当”的shell来尝试这一点,比如Cygwin'ed bash.exe,或者PowerShell,或者类似的

事实上,令人惊讶的是,大约20年前作为一个“DOS窗口”创建的cmd.exe,现在仍然存活下来