go执行cmd命令并获取输出内容

作者: adm 分类: go 发布时间: 2022-02-17 08:39

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)
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!