WMIC的Java命令在安装了exe后无法使用。

问题描述 投票:0回答:2

一个非常简单的代码,在调试模式下运行得很好,但在安装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之前的命令在实际环境中也会返回一个空的响应。

java wmic
2个回答
1
投票

一个带有参数的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

更多信息。

https:/mkyong.comjavahhow-execute-shell-command-from-java。


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.