golang 怎么使用管道执行windows命令

需要在windows下执行这个命令,

netstat -an |find /c "8888"

这样写不行的,还有办法吗?谢谢

if c, err = exec.Command("cmd", "/c", "netstat -an", "|", "find", "/c", "8888").CombinedOutput(); err != nil {
    log.Fatal(err)
}
阅读 4.9k
2 个回答

管道的本质是将程序的输出作为next的输入,程序前三个fd是stdin、stdout、stderr三个文件输入输出。

os/exec.Cmd定义里面就有这三个结构。

type Cmd struct {
    Stdin io.Reader
    Stdout io.Writer
    Stderr io.Writer
    ...
}

那么我们就将netstat的stdout转换成find的stdin即可。

后续go代码随便写的,未测试,不保证可靠。

    // 创建读写转换管道
    r, w := io.Pipe()
    defer r.Close()
    defer w.Close()
    
    // 执行netstat
    cmd := os.Command("netstat"...)
    cmd.Stdout = w
    cmd.Run()
    
    // 执行find
    cmd = os.Command("find")
    cmd.Stdin = r
    cmd.Run()

但是os/exec库封装了管道了,可以直接拿到三个fd的管道,具体见godoc

    // 执行netstat
    cmd := os.Command("netstat"...)
    r, err := cmd.StdoutPipe()
    if err != nil {
        return err
    }
    defer r.Close
    cmd.Run()
    
    // 然后执行find
    cmd = os.Command("find")
    cmd.Stdin = r
    cmd.Run()

这个不行,可以使用golang 的管道呀? io.Pipe()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题