gpt4 book ai didi

java - 命令字符串中带引号的 Groovy 外部命令

转载 作者:行者123 更新时间:2023-12-02 18:31:53 26 4
gpt4 key购买 nike

这与 Groovy execute external RTC command with quotes in the command 相关。我在组件列表中添加的引号被 shell 解释为命令本身的一部分。

这是应该运行的命令(如果直接在命令行上运行则执行):

scm workspace add-components test-workspace -s test-stream "test1" "test 2" -r url

问题似乎来自“test1”“test2”

这作为 ArrayList 传递到命令方法,然后转换为字符串:

void addComponents(String repository, String name, String flowTarget, ArrayList components) {
String compStr = components.toString().replace("[", "'").replace("]", "'").replace(", ", "' '")
println compStr
String cmd = "scm workspace add-components ${name} -s ${flowTarget} ${compStr} -r ${repository}"
println cmd

def proc = ["scm", "workspace","add-components", "${name}","-s", "${flowTarget}","${compStr}","-r", "${repository}"].execute()

//def proc = cmd.execute()
proc.waitFor()

getReturnMsg(proc)
}

我尝试过直接字符串以及将命令放入数组并传递它来执行。

Unmatched component ""test1" "test 2""

从错误看来,它不是寻找组件 test1,而是一起寻找“test1 test2”。

基于此,我似乎需要将“test1”和“test 2”分离到数组中的单独元素中,如下所示:

def proc = ["scm", "workspace", "add-components","Jenkins_${name}_${workspaceId}_Workspace","-s",flowTarget,"test1","test 2","-r",repository].execute()

事实上,如果我像这样将组件列表硬编码到命令数组中,它确实可以工作。

问题是组件列表的长度根据项目的不同而变化。有没有办法构造这样的可变长度命令数组?组件列表来自 JSON 文件,其结构如下:

{
"project": [
{
"name": "Project1",
"components": [
"component1",
"component 2",
"component 3"
]
},
{
"name": "Project2",
"components": [
"component1",
"component 4",
"component 5",
"component6"
]
}
]
}

最佳答案

Groovy 的 String#execute() 和 Java 的 Runtime#exec(String) 使用简单的 new java.util.StringTokenizer() 来 split 论点。不涉及 shell,因此 split 的规则是不同的(并且更原始)。传递列表/数组更安全,在这种情况下,分割是显式的,并且参数将按原样传递给进程。这意味着您需要确保参数不包含任何不应传递给进程的字符(例如引号)。

关于java - 命令字符串中带引号的 Groovy 外部命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23571122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com