Как выполнить команду PowerShell из JavaFX - PullRequest
0 голосов
/ 09 июля 2019

У меня есть команда Powershell, которую я хотел бы знать, как выполнить из Java / JavaFx:

powershell.exe Get-WMIObject Get-WMIObject Win32_SerialPort | Select-Object Name,DeviceID,Description,Caption, PNPDeviceID,Status | Out-File -FilePath C:\\path\\to\\file\\test.txt

Я прочитал и попробовал несколько примеров, которые я нашел в Интернете и на форумах. Но я все еще застрял! Это метод JavaFx, который я использую:

public void PowerShellCommand() throws IOException
    {
        String command = "powershell.exe Get-WMIObject Get-WMIObject Win32_SerialPort | Select-Object Name,DeviceID,Description,Caption, PNPDeviceID,Status | Out-File -FilePath C:\\path\\to\\file\\test.txt";
        Process powerShellProcess = Runtime.getRuntime().exec(command);
        powerShellProcess.getOutputStream().close();
    }

Выполнение команды непосредственно в PowerShell дает правильные результаты. Файл .txt с содержимым создан. Как этот (это правильно):

Name        : Kommunikationsanschluss (COM1)
Description : Kommunikationsanschluss
Caption     : Kommunikationsanschluss (COM1)
PNPDeviceID : ACPI\PNP0501\1
Status      : OK

( Цель - извлечь различные результаты из содержимого файла .txt и отобразить их в пользовательском интерфейсе ).

Но использование кода в приведенном выше методе создает пустой файл .txt. Я, конечно, что-то делаю не так, и мне понадобится помощь, чтобы это исправить.

У вас есть идеи? Ваше время и помощь очень ценятся!

AveJoe

PS: я использую компьютер с Windows 10 Pro.

1 Ответ

3 голосов
/ 09 июля 2019

Я полагаю, что вы на самом деле задаете несколько вопросов, в том числе

  1. Как выполнить команду powershell из Java?
  2. Как прочитать файл в Java?
  3. Как отобразить содержимое текстового файла в JavaFX GUI?

Я отвечу на первый вопрос.
(Действительно, я считаю, что сообщение должно содержать один вопрос.)

Конструктор ProcessBuilder принимает массив String.Каждое слово в вашей команде становится отдельным элементом в массиве.Слова разделяются одним или несколькими пробелами.
Также вам нужно прочитать вывод Process и вывод ошибок.Я рекомендую создать два отдельных потока - один для вывода, а другой для ошибки.А поскольку вы легко можете записать вывод Process в файл, нет необходимости использовать Out-File в вашей команде powershell.

Вот Java-программа для выполнения команды powershell из вашего вопроса.

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class ProcBldr {

    public static void main(String[] args) {
        ProcessBuilder procBldr = new ProcessBuilder("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                                                     "Get-WMIObject",
                                                     "Win32_SerialPort",
                                                     "|",
                                                     "Select-Object",
                                                     "Name,DeviceID,Description,Caption,PNPDeviceID,Status");
        Process proc;
        try {
            proc = procBldr.start(); //throws java.io.IOException
            Thread out = new Thread(new ProcOutput(proc.getInputStream(), new File("C:\\Users\\USER\\stdout00.txt")));
            Thread err = new Thread(new ProcOutput(proc.getErrorStream(), new File("C:\\Users\\USER\\stderr00.txt")));
            out.start();
            err.start();
            int exitCode = proc.waitFor(); //throws java.lang.InterruptedException
            out.join();
            err.join();
            System.out.println("\nExited with error code : " + exitCode);
        }
        catch (IOException | InterruptedException x) {
            x.printStackTrace();
        }
    }
}

class ProcOutput implements Runnable {
    private BufferedReader buffReader;
    private PrintWriter pw;

    public ProcOutput(InputStream is, File f) throws IOException {
        InputStreamReader isr = new InputStreamReader(is);
        buffReader = new BufferedReader(isr);
        pw = new PrintWriter(f);
    }

    public void run() {
        try {
            String line = buffReader.readLine();
            while (line != null) {
                pw.append(line);
                pw.append(System.lineSeparator());
                line = buffReader.readLine();
            }
        }
        catch (IOException xIo) {
            throw new RuntimeException(xIo);
        }
        finally {
            pw.close();
            try {
                buffReader.close();
            }
            catch (IOException xIo) {
                // Ignore.
            }
        }
    }
}

Вывод команды powershell записывается в файл stdout00.txt.Файл содержит следующее ...

Name        : Communications Port? (COM1)
DeviceID    : COM1
Description : Communications Port
Caption     : Communications Port? (COM1)
PNPDeviceID : ACPI\PNP0501\0
Status      : OK

Я рекомендую прочитать статью Когда Runtime.exec () не будет .Он очень старый и был написан до того, как класс ProcessBuilder был частью JDK, но он также применяется к ProcessBuilder и, следовательно, по-моему, все еще относится к последней версии JDK (12.0.1 на момент написания этой статьи).

Обратите внимание, что моей средой является Windows 10 (64-разрядная версия) и Oracle JDK 12.0.1 (также 64-разрядная версия)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...