命令提示符的输出返回 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 程序。
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 程序。