Я полагаю, что вы на самом деле задаете несколько вопросов, в том числе
- Как выполнить команду powershell из Java?
- Как прочитать файл в Java?
- Как отобразить содержимое текстового файла в 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-разрядная версия)