在 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