我正在尝试用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工作?
非常感谢。
我通过从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工作。
每个更好的想法都是受欢迎的。
非常感谢。