Команда WMI C Java не работает после установки exe - PullRequest
0 голосов
/ 02 мая 2020

Очень простой код, отлично работающий в режиме отладки, но не работающий после установки exe, не дающий ответа / результата в ответ. даже ошибок не отследить.

После сборки .exe и установки на мой P C это происходит, очень странно. попробовал построитель процессов, но то же самое, во всяком случае, чтобы проверить / отследить его. может быть, пути?

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 перед тем, как команды также возвращают пустой ответ в фактическом env.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Внутренняя команда windows с аргументами, такими как "wmi c diskdrive ..." , может быть легко выполнена с помощью , заключив ее в окно cmd.

Вот фрагмент рабочего кода для запуска команды wmi c, инкапсулированной в окне cmd:

import java .io. * ;

publi c класс Wmi c {publi c stati c 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.com/java/how-to-execute-shell-command-from-java/

0 голосов
/ 02 мая 2020

Конструктор 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
...