Java ProcessBuilder не может обрабатывать пробелы и квоты - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь написать простое приложение на java, которое автоматически клонирует весь ствол от TFS до Git репо, используя git -tfs. Чтобы получить данные от пользователя, я использую некоторые jtextfields. В одном из jtextfields пользователь должен написать имя соединительной линии. Все работает, но, если имя транка содержит пробелы, весь процесс git -tfs не запускается, а в журналах git tfs говорится о соблюдении synopsys.

Для запуска git -tfs, synopsys:

$ git-tfs.exe --username <username> --password <password> <server-url> <trunk-name> <working-folder-path>

es .:

$ git-tfs.exe --username=myusernamename --password=mypassword http://127.0.0.1:8080/DefaultCollection $/TrunkName C:\workingFolder

Вот мой код:

commands = new ArrayList<String>();
commands.add("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe");
commands.add("/c");
commands.add("git-tfs.exe");
commands.add("--username=" + usernameTextField.getText());
commands.add("--password=" + passwordTextField.getText());
commands.add(serverUrlTextField.getText());
commands.add(trunkTextField.getText());
commands.add(workingFolder.getText());
ProcessBuilder pb = new ProcessBuilder(this.commands);
Process process = pb.start();

В поисках net я нашел решение для git -tfs и записать имя соединительной линии в квоты, такие как $ / "имя ствола / некоторые / путь". Запуск git -tfs с квотами из powershell, все работает нормально, но писать то же самое в приложении jtextfield не может, снова говоря о синопсисе.

Чтобы протестировать сборщик процессов, я попытался изменить ArrayList с помощью команд, добавив вручную измененная строка, чтобы она выглядела:

...
this.commands.add("$/\"trunk name\"");
...

даже не так, как это работает, поэтому я попытался:

...
this.commands.add("$/\\\"trunk name\\\"");
..

, и это работает.

После этого я пытался напишите то же самое на jtextfield, но это не может работать. Как я могу исправить проблему и разобрать текст из jTextField и позволить процессу processBuilder работать?

Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

Я решил проблему, изменив ProcessBuilder на Runtime, так что теперь мой код:

commands = new ArrayList<String>();
commands.add("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe");
commands.add("/c");
commands.add("git-tfs.exe");
commands.add("--username=" + usernameTextField.getText());
commands.add("--password=" + passwordTextField.getText());
commands.add(serverUrlTextField.getText());
commands.add(trunkTextField.getText());
commands.add(workingFolder.getText());
Runtime runtime = Runtime.getRuntime();
String[] commandsStringArray = commands.toArray(new String[0]);
Process process = runtime.exec(commandsStringArray);

и проверяя имя проекта следующим образом:

    private String fixProjectName(String projectName) {
    if (projectName.contains(" ")) {
        String correct = "";
        correct = projectName.replace("$/", "");
        correct = "$/\\\"" + correct + "\\\" ";
        this.projectName = correct;
        return correct;
    }
    return projectName;
}

Кстати, я хотел бы того же чтобы позволить ProcessBuilder работать.

Приветствуется каждая лучшая идея.

Спасибо.

...