Java ProcessBuilder 无法处理空格和配额

Java ProcessBuilder can't handle spaces and quotas

我正在尝试在 java 中编写一个简单的应用程序,它将使用 git-tfs 自动将整个 t运行k 从 TFS 克隆到 Git 存储库.为了从用户那里获取数据,我使用了一些 jtextfields。在其中一个 jtextfields 中,用户必须写入 t运行k 名称。一切正常,但是,如果 t运行k 名称包含空格,则整个 git-tfs 进程不会启动并且 git tfs 日志说尊重 synopsys。

至运行 git-tfs 概要是:

$ 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();

网上冲浪我找到了git-tfs 的解决方案,它是将t运行k 名称写在配额中,如$/"trunk name/some/path"。 运行 git-tfs 与 powershell 的配额一切正常,但在 jtextfield 应用程序中编写相同的内容不能 运行 再说一遍概要。

为了测试进程构建器,我尝试通过手动添加修改后的字符串来使用命令修改 ArrayList,使其出现:

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

连这个都行不通所以我试了:

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

而且有效。

在此之后,我尝试在 jtextfield 上编写相同的内容,但它无法工作。 我该如何解决问题并解析来自 jTextField 的文本并让 processBuilder 工作?

谢谢!

我通过从 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 工作。

欢迎提出更好的想法。

谢谢。