dreamy1992 2016-08-25 17:31
浏览 306
已采纳

Golang-执行命令,其中一部分为空格

I am running a command through the os/exec package that is called like this:

out, err := Exec("ffprobe -i '/media/Name of File.mp3' -show_entries format=duration -v quiet -of csv=p=0", true, true)

The function I have written to execute command line calls is:

func Exec(command string, showOutput bool, returnOutput bool) (string, error) {
    log.Println("Running command: " + command)

    lastQuote := rune(0)
    f := func(c rune) bool {
        switch {
        case c == lastQuote:
            lastQuote = rune(0)
            return false
        case lastQuote != rune(0):
            return false
        case unicode.In(c, unicode.Quotation_Mark):
            lastQuote = c
            return false
        default:
            return unicode.IsSpace(c)
        }
    }

    parts := strings.FieldsFunc(command, f)
    //parts = ["ffprobe", "-i", "'/media/Name of File.mp3'", "-show_entries", "format=duration", "-v", "quiet", "-of", "csv=p=0"]
    if returnOutput {
        data, err := exec.Command(parts[0], parts[1:]...).Output()
        if err != nil {
            return "", err
        }
        return string(data), nil
    } else {
        cmd := exec.Command(parts[0], parts[1:]...)
        if showOutput {
            cmd.Stderr = os.Stderr
            cmd.Stdout = os.Stdout
        }
        err := cmd.Run()
        if err != nil {
            return "", err
        }
    }

    return "", nil
}

The strings.Fields command splits the command on spaces and that is used as the string array to pass to the exec.Command function. The problem is that it is splitting the filename into different parts because of the space when that filepath needs to stay together. Even if I format the string array correctly so the filepath is in one part, the exec.Command still fails because there is a space. I need to be able to execute this script to honor the filepath as one argument with spaces.

  • 写回答

2条回答 默认 最新

  • doujian1050 2016-08-25 20:59
    关注

    Well, I figured it out.

    var parts []string
    preParts := strings.FieldsFunc(command, f)
    for i := range preParts {
        part := preParts[i]
        parts = append(parts, strings.Replace(part, "'", "", -1))
    }
    

    I needed to remove the single quotes from the arg passed into the exec.Command function.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名