Откройте PowerShell с помощью Java Processbuilder и держите его открытым - PullRequest
0 голосов
/ 06 февраля 2019

Есть ли способ, как открыть 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 или проблемас символами, это лучшее решение.

...