命令将无法通过ProcessBuilder执行“ CreateProccess error = 2”

时间:2019-12-13 12:42:59

标签: java string processbuilder

我正在尝试将字符串数组传递给函数到ProcessBuilder。 当我通过数组时,我得到:

  

CreateProccess error=2, The system cannot find the file specified

代码如下:

public static String[] splitCommand(GitNotifier gn) {
    String s = gn.tf[1].getText();
    String[] command = s.split("\\s+" + "\b");
    return command; 
}
public static void process(GitNotifier gn) throws IOException {
    String[] command = {"git", "log", "-1", "HEAD"};
    ProcessBuilder builder = new ProcessBuilder(command);          // works
    ProcessBuilder builder = new ProcessBuilder(splitCommand(gn)); // doesn't
    builder = builder.directory(new File(path));
    Process p = builder.start();
    printOutput(p);
}

带有Arrays.toString(splitCommand(gn))的字符串如下所示:

  

"[git log -1 HEAD]"

使用Arrays.toString(command))时,字符串如下所示:

  

"[git, log, -1, HEAD]"

我真的没有在这里扮演逗号的角色...

1 个答案:

答案 0 :(得分:0)

问题是String[]创建的splitCommand(GitNotifier gn)。它似乎由单个String组成,即"git log -1 HEAD",可以很好地在控制台中手动输入,但不适用于ProcessBuilder

ProcessBuilder有两个构造函数:

ProcessBuilder(List<String> command)

ProcessBuilder(String... command)

您仅使用第二个选项,其中参数中的第一项被视为可执行文件,而其余所有项均被视为对该可执行文件的调用参数。显然是由于空白,这与将参数化调用复制为String粘贴到打开的控制台中不同,但这只是一个猜测。

通过创建

可以正确地将参数与可执行文件分开。
String[] command = {"git", "log", "-1", "HEAD"};

并将其传递给构造函数:new ProcessBuilder(command),因为String...是(或将转换为)String[]

但是,splitCommand(GitNotifier gn)不会创建相同的String[](检查其长度,很可能是1),这就是呼叫无法正常工作的原因。

相关问题