首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令不会通过ProcessBuilder "CreateProccess error=2“执行

命令不会通过ProcessBuilder "CreateProccess error=2“执行
EN

Stack Overflow用户
提问于 2019-12-13 12:42:59
回答 1查看 57关注 0票数 1

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

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

下面是代码:

代码语言:javascript
复制
public static String[] splitCommand(GitNotifier gn) {
    String s = gn.tf[1].getText();
    String[] command = s.split("\\s+" + "\b");
    return command; 
}
代码语言:javascript
复制
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]"

我真的不明白逗号的角色.

EN

回答 1

Stack Overflow用户

发布于 2019-12-13 13:22:15

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

ProcessBuilder有两个构造函数:

代码语言:javascript
复制
ProcessBuilder(List<String> command)

代码语言:javascript
复制
ProcessBuilder(String... command)

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

必须将参数从可执行文件中分离出来,这是通过创建

代码语言:javascript
复制
String[] command = {"git", "log", "-1", "HEAD"};

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

但是,splitCommand(GitNotifier gn)并没有创建相同的String[] (检查它的长度,很可能是1),这就是调用不能工作的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59322867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档