关于args和从position [1](不是position 0)传递args的问题

时间:2019-06-17 18:58:19

标签: 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将是其后每个空间限定值。

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

  2. 怎么可能做这样的事情,在这里我可以从索引中引用args ...? (以下代码不起作用,无法以这种方式引用args)

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

2 个答案:

答案 0 :(得分:2)

如果来自配置文件的值是Shell可执行的格式,那么您将遇到很多问题,这些问题只是在空格之间进行分割(例如,引号中包含空格的参数)。如果您希望使用在shell中可执行的命令行,则需要让shell执行它:

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

没有办法将字符串转换为args,因为它在shell中会有所不同。

答案 1 :(得分:-1)

我发现了与此问题有关的线索:https://groups.google.com/forum/#!topic/golang-nuts/pNwqLyfl2co

编辑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 + " "
}

此处描述的问题:

https://github.com/golang/go/issues/17149