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 工作。
欢迎提出更好的想法。
谢谢。
我正在尝试在 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 工作。
欢迎提出更好的想法。
谢谢。