Есть ли способ, как открыть PowerShell с помощью компоновщика процессов в javafx и оставить его открытым для выполнения любой команды в любое время?
Пример кода (выполнение только одной команды за раз):
try {
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "powershell -Command \"Add-Type -AssemblyName System.DirectoryServices.AccountManagement; [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.DisplayName\"&&exit");
Process p = builder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
if (!line.trim().isEmpty()) {
displayname = line;
}
}
reader.close();
p.waitFor();
p.destroy();
} catch (IOException | InterruptedException ex) {
Logger.getLogger(AccountStatus.class.getName()).log(Level.SEVERE, null, ex);
}
Причина, по которой он остается открытым: загрузка PowerShell занимает, возможно, 3 секунды, а загрузка, например, подключаемого модуля активной директории, занимает, возможно, еще 2 секунды каждый раз, когда я хочу выполнить какую-либо команду.Если есть какой-то способ, как предварительно загрузить PowerShell и отправить команду сборщику процессов в любое время, это было бы очень полезно, спасибо за советы.
РЕДАКТИРОВАТЬ:
Я нашел решениездесь: Apache Commons exec PumpStreamHandler непрерывный ввод
Благодаря MichalVales!
С помощью этого быстрого примера я могу открыть PowerShell, держать его открытым, предварительно загрузить какой-либо модуль и выполнитьлюбая новая команда в любое время без повторной загрузки.
public class FXMLDocumentController implements Initializable {
private BufferedWriter writer;
@FXML
private void handleButtonAction(ActionEvent event) {
try {
writer.write("Import-Module ActiveDirectory -Cmdlet Get-ADUser\n");
writer.flush();
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@FXML
private void handleButtonAction2(ActionEvent event) {
try {
writer.write("Get-ADUser somenamehere -Properties * | Select-Object LockedOut\n");
writer.flush();
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
ProcessBuilder builder = new ProcessBuilder("powershell.exe");
Process process;
try {
process = builder.start();
writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
StreamReader outputReader = new StreamReader(process.getInputStream(), System.out);
outputReader.start();
StreamReader err = new StreamReader(process.getErrorStream(), System.err);
err.start();
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Код StreamReader можно найти по ссылке из MichalVales
EDIT2:
Я пытался передать чешские символы любому писателю, но безуспешно.Я думаю, что невозможно передать чешские символы, такие как «ěščřžýáíé», в PowerShell без изменения языкового стандарта системы, но я не хочу этого делать.Я пробовал Process Builder, Apache Exec, все не удалось, но я нашел супер-библиотеку, которая работает и очень проста в использовании: jPowerShell
Так что если у вас есть проблемы с поддержанием PowerShell или проблемас символами, это лучшее решение.