开发者问题收集

在 Go 脚本中运行 `exec.Command` 时如何修复“语法错误:未知标记不能放在此处”

2019-04-17
3585

我尝试在 Go 脚本中使用 osascript 运行此 Apple Script 命令,但出现错误 0:1:语法错误:未知标记不能放在此处。(-2740)

这是在终端中运行时效果很好的命令!

/usr/bin/osascript -e 'on run {f, c}' -e 'tell app "Finder" to set comment of (POSIX file f as alias) to c' -e end "/Users/computerman/Desktop/testfile.png" "Hello, World"

下面的 Go 脚本实际上输出了上述字符串,我可以直接在终端中剪切并粘贴它,它就可以正常工作。但是,运行 Go 脚本本身时,我得到了上述错误。

请帮忙!

这是在 MacOS 10.14.4 (18E2034) 上。我尝试用更简单的字符串“Finder”替换 fmt.Sprintf,但遇到了完全相同的问题。


import (
    "fmt"
    "log"
    "os"
    "os/exec"
)

func main() {
    filepath := "/Users/computerman/Desktop/testfile.png"
    comment := "Hello, World"
    onrun := "'on run {f, c}'"
    command := fmt.Sprintf(`'tell app "Finder" to set comment of (POSIX file f as alias) to c' -e end "%s" "%s"`, filepath, comment)
    log.Println("/usr/bin/osascript", "-e", onrun, "-e", command)
    cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    err := cmd.Run()
    if err != nil {
        log.Println(err)
    }
}

当我执行 go run main.go 时,我在终端中得到了这个

2019/04/17 13:02:28 exit status 1

我期望输出

Hello, World

并且没有错误。另外,文件中的注释字段将更新为 Hello, World。

2个回答

感谢之前的评论,我找到了答案。这是正确的代码。感谢 Adrian 指出你不需要单引号,所以我删除了它们,也感谢 Nick 指出结束标志需要与该字符串分开。

func main() {
    filepath := "/Users/computerman/Desktop/testfile.png"
    comment := "Hello, World"
    onrun := "on run {f, c}"
    command := fmt.Sprintf(`tell app "Finder" to set comment of (POSIX file f as alias) to c`)
    //log.Println("/usr/bin/osascript", "-e", onrun, "-e", command)
    cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", "end", filepath, comment)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    err := cmd.Run()
    if err != nil {
        log.Println(err)
    }
}

它有效!

thetall0ne
2019-04-17

您还需要在 command 末尾添加 -e 和注释,如下所示。希望这样可以生成与原始命令中相同数量的参数。

func main() {
    filepath := "/Users/computerman/Desktop/testfile.png"
    comment := "Hello, World"
    onrun := "'on run {f, c}'"
    command := fmt.Sprintf(`'tell app "Finder" to set comment of (POSIX file f as alias) to c'`)
    end := fmt.Sprintf(`end "%s")`, filepath)
    log.Println("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", end, comment)
    cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", end, comment)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    err := cmd.Run()
    if err != nil {
        log.Println(err)
    }
}
Nick Craig-Wood
2019-04-17