提问者:小点点

Java ProcessBuilder无法处理空间和配额


我正在尝试用java编写一个简单的应用程序,它将使用git-tfs自动克隆从TFS到Git repo的整个主干。为了从用户那里获取数据,我使用了一些jtext字段。在其中一个jtext字段中,用户必须写入主干名称。一切正常,但是,如果主干名称包含空格,整个git-tfs进程就不会启动,git tfs日志说要尊重synoophs。

要运行git-tfs,synoophs是:

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

锿。:

$ 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的解决方案,它将中继名称写入配额中,如$/“trunk name/some/path”。使用powershell中的配额运行git tfs一切正常,但在jtextfield应用程序中编写同样的代码无法再次运行。

为了测试process builder,我尝试使用命令修改ArrayList,方法是手动添加修改后的字符串,使其出现:

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

即使这样也不行,所以我试着:

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

这是可行的。

在此之后,我试图在jtextfield上写同样的内容,但它无法工作。我如何解决这个问题,从jTextField解析文本,让processBuilder工作?

非常感谢。


共1个答案

匿名用户

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

每个更好的想法都是受欢迎的。

非常感谢。