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只返回null。我猜因为它已经到达控制台的末尾。我如何阅读上面的输出。任何帮助将不胜感激。
答案 0 :(得分:1)
在删除转义反斜杠后,你有没有想过这行是什么或者你有至少一行从命令提示符窗口执行此行?
"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命令进程的命令提示符窗口启动一个新的命令进程,以执行包含多个命令的命令行,并在命令行执行完成后保持命令提示符窗口打开。
第二个命令提示符窗口中的第三个命令进程确实输出了行,但Java应用程序没有捕获此命令进程的输出。
有必要使用命令exit
来终止第三个命令进程,从而关闭已经打开的命令提示符窗口,并使用命令start
启动第二个命令进程。
因为运算符是&&
而不仅仅是&
,所以只有在命令dir
成功之前,才会执行命令cd
。有关&
和&&
的详细信息,请参阅Single line with multiple commands using Windows batch file。如果当前驱动器位于与要设置为新当前目录的目录驱动器不同的驱动器上,则不带参数cd
的命令/D
将无法更改当前目录。
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"
如果netstat
没有输出包含字符串ldap
的 STDOUT ,则无法输出/捕获任何行,无论如何重定向到{strong> STDIN { {1}}在这里作为过滤器工作。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
findstr
cd /?
cmd /?
dir /?
findstr /?
netstat /?
另请阅读Microsoft文章Using command redirection operators。
答案 1 :(得分:0)
您正在执行的命令是
cmd /c start cmd.exe /K \"cd c:/Window...
请注意,您运行cmd
并要求它运行start
,这将创建一个新的(不同的)控制台会话,在该会话中执行后续命令字符串。 start
命令的输出是您正在阅读的内容,start
通常不会打印任何内容,这就是您正在阅读的内容。
由于您在新的会话/窗口中运行了命令字符串,因此您需要输出。完全省略start
以使输出返回到Java程序。