一个非常简单的代码,在调试模式下运行得很好,但在安装exe后却不能工作,没有任何回应,甚至没有错误可追踪。
试过process builder,但同样的事情,无论如何都要检查跟踪它,也许是路径?
StringBuilder b = new StringBuilder();
Process p = Runtime.getRuntime().exec("wmic diskdrive get signature");
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
b.append(line);
}
请注意:CMD c之前的命令在实际环境中也会返回一个空的响应。
一个带有参数的windows内部命令,如 "wmic diskdrive ..." 可以通过以下方式轻松执行 将其封装在cmd窗口中。
这里是运行封装在cmd窗口中的wmic命令的工作代码片段。
import java.io.*.public class Wmic { public static void main(String] args)
public class Wmic { public static void main(String[] args) {
StringBuilder b = new StringBuilder();
try {
// Initialize a process object to run
// wmic command and its parameters
// inside a cmd window
Process process = Runtime.getRuntime()
.exec("cmd /c C:\\Windows\\System32\\wbem\\WMIC.exe diskdrive get signature");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
b.append(line);
}
} catch (Exception ex) {
b.append(ex.toString());
}
System.out.println("Output: \n" + b.toString());
}
}
产出。
>javac Wmic.java
>java Wmic
Output:
Signature
更多信息。
该 ProcessBuilder
构造函数接收一个字符串列表。当使用 ProcessBuilder
要运行一个命令,我把命令中的所有字都分离成独立的字符串。
我在一个单独的线程中读取进程的输出。而且我总是等待命令,我通过 ProcessBuilder
,以终止。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
public class PrcBldTs {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("wmic","diskdrive","get","signature");
try {
Process proc = pb.start();
StreamGobbler error = new StreamGobbler(proc.getErrorStream());
StreamGobbler output = new StreamGobbler(proc.getInputStream());
Thread stdout = new Thread(output);
Thread stderr = new Thread(error);
stdout.start();
stderr.start();
int result = proc.waitFor();
stdout.join();
stderr.join();
System.out.println("Exit status = " + result);
if (result != 0) {
System.out.println(error.getContents());
}
else {
System.out.println(output.getContents());
}
}
catch (IOException | InterruptedException x) {
x.printStackTrace();
}
}
}
class StreamGobbler implements Runnable {
private BufferedReader reader;
private StringWriter sw;
public StreamGobbler(InputStream is) {
InputStreamReader isr = new InputStreamReader(is);
reader = new BufferedReader(isr);
sw = new StringWriter();
}
public String getContents() {
return sw.toString();
}
public void run() {
try {
String line = reader.readLine();
while (line != null) {
sw.append(line);
sw.append(System.lineSeparator());
line = reader.readLine();
}
}
catch (IOException xIo) {
throw new RuntimeException(xIo);
}
}
}
运行上面的代码,我得到了以下输出。
Exit status = 0
Signature
1145609371