Go Args和从位置[1]传递Args(不是位置0)

Go Args和从位置[1]传递Args(不是位置0),go,Go,我正在从配置文件config.json读取命令行字符串: "execmd" : "c:\\windows\\system32\\cmd.exe /c runscript.cmd" 我想将其传递给exec.Command-但此函数需要2个参数: exec.Comm*emphasized text*and (cmd, args...) 其中,cmd是第一个段cmd.exe,args则是此后的每个空间清除值 我不确定是否需要读取配置字符串,然后手动将其拆分为每个空间清除器的数组?有没有什么方法可以

我正在从配置文件config.json读取命令行字符串:

"execmd" : "c:\\windows\\system32\\cmd.exe /c runscript.cmd"
我想将其传递给exec.Command-但此函数需要2个参数:

exec.Comm*emphasized text*and (cmd, args...)
其中,cmd是第一个段cmd.exe,args则是此后的每个空间清除值

我不确定是否需要读取配置字符串,然后手动将其拆分为每个空间清除器的数组?有没有什么方法可以轻松地将字符串转换为参数

怎么可能做这样的事情,我可以参考args。。。从一个索引?下面的代码不起作用,无法以这种方式引用args

exec.Command (arg[0], args[1]...)

如果来自配置文件的值是shell可执行的格式,那么在拆分空格时会遇到很多问题,例如,包含空格的引用参数。如果您想接收一个在shell中可执行的命令行,那么您需要一个shell来执行它:

exec.Command("cmd.exe", "/c", execmd)

无法将字符串转换为args,因为每个shell的字符串都不同。

我发现了与此问题相关的线程:

编辑1:没用

看到了这个使用RegExp的例子,并了解了如何索引到args中:

r := regexp.MustCompile("'.+'|\".+\"|\\S+")
s := appConfig.JobExec.ExecProcess
m := r.FindAllString(s, -1)
Exec.Command (m[0],m[1:])
这似乎也适用于带引号的字符串

编辑2:

它不起作用,在windows上也不起作用,在使用cmd运行时传递参数存在问题。使用sysprocattr.cmdline将使其正常工作:

cmdins := exec.Command(cmd)
cmdins.SysProcAttr = &syscall.SysProcAttr{}
for _, arg := range args {
    cmdins.SysProcAttr.CmdLine = cmdins.SysProcAttr.CmdLine + arg + " "
}
这里描述的问题是:


是的,关于引用的参数,如果我必须自己写的话,代码也会变得有点重。但是config中的字符串应该代表一个完整的shell命令,所以我也将使用带引号的参数-有没有办法将其转换为args,以便Exec.command支持它?可能是这样的:或者这样:好的-你有什么建议吗?它可以由regex完成吗?或者我应该中止该路径吗?我不认为pkg/regexp不支持的没有lookarounds的regex可以做到这一点。您必须解析字符串,或者让shell为您进行解析。似乎windows和cmd在使用命令时出现了问题-相反,我让它构建cmdline。