首页 > 技术文章 > go执行cmd命令并获取输出内容

snyn 2022-05-10 14:45 原文

func RunCMD() {
    cmd0 := exec.Command("tasklist")
    stdout0 , err := cmd0.StdoutPipe() // 获取命令输出内容
    if err != nil {
        fmt.Println(err)
        return
    }
    if err := cmd0.Start(); err != nil {  //开始执行命令
        fmt.Println(err)
        return
    }
 
    useBufferIO := false
    if !useBufferIO {
        var outputBuf0 bytes.Buffer
        for {
            tempoutput := make([]byte, 256)
            n, err := stdout0.Read(tempoutput)
            if err != nil {
                if err == io.EOF {  //读取到内容的最后位置
                    break
                } else {
                    fmt.Println(err)
                    return
                }
            }
 
            if n > 0 {
                outputBuf0.Write(tempoutput[:n])
            }
 
        }
 
        fmt.Println(outputBuf0.String())
    } else {
        outputbuf0 := bufio.NewReader(stdout0)
        touput0 , _ , err := outputbuf0.ReadLine()
        if err != nil {
            return
        }
 
        fmt.Println(string(touput0))
    }
}

管道模式

//管道模式
func RunCMDPipe()  {
    cmd1 := exec.Command("tasklist")
    var outputbuf1 bytes.Buffer
    cmd1.Stdout = &outputbuf1  //设置输入
    if err := cmd1.Start(); err != nil {
        fmt.Println(err)
        return
    }
    if err := cmd1.Wait(); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%s", outputbuf1.Bytes())
}

内存的命名管道实现

func MEMPIPE()  {
    reader, writer := io.Pipe() //返回两个值 一个是读io 一个是写io 读写会有锁
    go func() {
        output := make([]byte, 100)
        n, err := reader.Read(output)
        if err != nil {
            println(err)
            return
        }
        println("read", n)
    }()
 
 
    input := make([]byte, 26)
    for i:=65; i<=90; i++ {
        input[i - 65] = byte(i)
    }
    n, err := writer.Write(input)
    if err != nil {
        fmt.Println(err)
    }
    time.Sleep(time.Second * 3)
 
    fmt.Println("Write", n)
}

系统的管道 实现原理就是读写文件

// 系统的管道 实现原理就是读写文件
func SystempPIPE()  {
    reader, writer, err := os.Pipe() //一个是读os 一个是写os 读写会有锁
    if err != nil {
        println(err)
        return
    }
    go func() {
        output := make([]byte, 100)
        n, err := reader.Read(output)
        if err != nil {
            println(err)
            return
        }
        println("read", n)
    }()
 
 
    input := make([]byte, 26)
    for i:=65; i<=90; i++ {
        input[i - 65] = byte(i)
    }
    n, err := writer.Write(input)
    if err != nil {
        fmt.Println(err)
    }
    time.Sleep(time.Second * 3)
 
    fmt.Println("Write", n)
}

推荐阅读