我正在从配置文件(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 ...? (以下代码不起作用,无法以这种方式引用args)
exec.Command(arg [0],args [1] ...)
答案 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 + " "
}
此处描述的问题: