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


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

      

  • 相关阅读:
    c# System.Object类和数据的安全转型
    计算机内存的组织方式
    c# ref和out参数
    C# 复制值类型的变量和类
    PCB 布线,直角线,差分线,蛇形线
    c# 静态方法和数据
    c# 类的知识
    appium中从activity切换到html
    No Desktop License Servers available to provide a license
    adb命令连接Android模拟器夜神模拟器
  • 原文地址:https://www.cnblogs.com/shaoshao/p/14542746.html
Copyright © 2020-2023  润新知