为了账号安全,请及时绑定邮箱和手机立即绑定

带有双引号参数的 exec

带有双引号参数的 exec

Go
牛魔王的故事 2021-09-21 15:11:58
我想find使用exec包执行Windows 命令,但 Windows 正在做一些奇怪的转义。我有类似的东西: out, err := exec.Command("find", `"SomeText"`).Output()但这会引发错误,因为 Windows 正在将其转换为 find /SomeText"有谁知道为什么?如何find使用 exec 包在 Windows 上执行?
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

OK,这是一个比较复杂一点比你预期,但有是一个解决方案:


package main


import (

    "fmt"

    "os/exec"

    "syscall"

)


func main() {

    cmd := exec.Command(`find`)

    cmd.SysProcAttr = &syscall.SysProcAttr{}

    cmd.SysProcAttr.CmdLine = `find "SomeText" test.txt`

    out, err := cmd.Output()

    fmt.Printf("%s\n", out)

    fmt.Printf("%v\n", err)

}

不幸的是,尽管在 2011 年添加了对此的支持,但似乎尚未将其纳入文档。(虽然也许我只是不知道在哪里看。)


查看完整回答
反对 回复 2021-09-21
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

仅供参考,运行:


package main


import (

    "fmt"

    "os/exec"

)


func main() {

    cmd := exec.Command("find", `"SomeText"`)

    fmt.Printf("Path: %q, args[1]: %q\n", cmd.Path, cmd.Args[1])

}

playground


在 unix 上给出:


Path: "/usr/bin/find", args[1]: "\"SomeText\""

并交叉编译到 Windows 并在 Win7 上运行给出:


Path: "C:\\Windows\\system32\\find.exe", args[1]: "\"SomeText\""

两者在我看来都是正确的。


添加out, err := cmd.Output()到 Windows 交叉编译为以下内容提供fmt.Printf("%#v\%v\n", err, err):


&exec.ExitError{ProcessState:(*os.ProcessState)(0xc0820046a0)}

exit status 1

但我想那只是因为 find 找不到任何东西。


查看完整回答
反对 回复 2021-09-21
  • 2 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信