命令提示符的输出返回 null

Output from command prompt returning null

String line;
String output = "";
Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe /K \"cd c:/Windows/system32 && dir && netstat | Findstr \"ldap\"\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    output += (line + '\n');
}
System.out.println(output);
input.close();

这段代码对很多人来说似乎很完美,但对我来说 input.readline 只是 returns null.I 猜测,因为它已经到达 console.How 的末尾,我是否阅读输出 above.Any 帮助将不胜感激。

您有没有想过这一行的作用,或者在删除转义反斜杠后,您是否至少有一些人在命令提示符 window 中执行过这一行?

"cmd /c start cmd.exe /K \"cd c:/Windows/system32 && dir && netstat | Findstr \"ldap\"\""

第一个命令过程:

cmd /c 启动一个新的 Windows 命令进程,当所有命令完成时该进程自动关闭。此命令进程只有一个命令要处理 - start - 成功时不输出任何内容。

这解释了为什么从 Java 应用程序中启动的命令进程没有捕获输出行。

第二个命令过程:

start 启动一个新的 Windows 命令进程来执行命令。要执行的命令是:cmd /K
执行此命令后,命令进程将关闭,就像使用 cmd /c.

时一样

第三个命令过程:

cmd /K 使用当前(第二)Windows 命令进程的命令提示符 window 启动一个新的命令进程,以执行包含多个命令的命令行并保持命令提示符 window 命令行执行完成后打开。

第二个命令提示符 window 中的第三个命令进程确实输出了行,但是 Java 应用程序未捕获此命令进程的输出。

有必要使用命令 exit 终止第三个命令进程,导致关闭命令提示符 window 已经打开,第二个命令进程用命令 start 启动。

因为运算符是&&而不仅仅是&,只有在命令cd成功时才会执行命令dir。有关 &&& 的更多详细信息,请参阅 Single line with multiple commands using Windows batch file。如果当前驱动器与要设置为新当前目录的目录的驱动器不同,则不带参数 /D 的命令 cd 无法更改当前目录。

cd 在这里并不真正需要 dir,后者完全没用。

我建议使用:

"cmd.exe /C \"%SystemRoot%\system32\netstat.exe | %SystemRoot%\system32\findstr.exe /I /C:ldap\""

执行

的结果
cmd.exe /C "%SystemRoot%\system32\netstat.exe | %SystemRoot%\system32\findstr.exe /I /C:ldap"

没有行是 output/captured 如果 netstat 没有行输出到 STDOUT 包含字符串 ldap 在任何情况下重定向到 STDIN of findstr 在这里作为过滤器工作。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • cd /?
  • cmd /?
  • dir /?
  • findstr /?
  • netstat /?
  • start /?

另请阅读 Microsoft 文章 Using command redirection operators

您正在执行的命令是

cmd /c start cmd.exe /K \"cd c:/Window...

注意到你 运行 cmd 并要求它 运行 start,这会创建一个新的(不同的)控制台会话,在其中执行后续命令字符串。 start 命令的输出就是您正在阅读的内容,而 start 通常不打印任何内容,这就是您正在阅读的内容。

因为你 运行 你的命令字符串在一个新的 session/window 中,这就是你想要的输出的地方。完全省略 start 以将输出返回到您的 Java 程序。