Go执行CMD或者Shell命令并且实时输出到控制台,效果和CMD执行结果方式完全一样

很多时候我们需要调用操作系统的命令来执行一些程序,在某些特殊的情况下,我们需要拿到程序的调用结果,比如调用ping www.mashangedu.cn 能够返回每次ping的结果,以下代码为第二个版本,第一个版本参考网上,但是发现有中文异常,故又经过google,改进了第一版,俗话说天下文章一大套,就看你会不会套了,对于程序员来说也一样,就看怎么ctrl c v了。废话不多说了,上干货:

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"os/exec"
	"golang.org/x/text/encoding/simplifiedchinese"
)

type Charset string

const (
	UTF8    = Charset("UTF-8")
	GB18030 = Charset("GB18030")
)


func main(){
		execCommand(os.Args[1], os.Args[2:])
}

//封装一个函数来执行命令
func execCommand(commandName string, params []string) bool {

	//执行命令
	cmd := exec.Command(commandName,params...)

	//显示运行的命令
	fmt.Println(cmd.Args)
	
	stdout, err := cmd.StdoutPipe()
	errReader,errr := cmd.StderrPipe()

	if errr != nil{
		fmt.Println("err:"+errr.Error())
	}

	//开启错误处理
	go handlerErr(errReader)

	if err != nil {
		fmt.Println(err)
		return false
	}

	cmd.Start()
	in := bufio.NewScanner(stdout)
	for in.Scan() {
		cmdRe:=ConvertByte2String(in.Bytes(),"GB18030")
		fmt.Println(cmdRe)
	}

	cmd.Wait()
	cmd.Wait()
	return true
}

//开启一个协程来错误
func handlerErr(errReader io.ReadCloser){
	in := bufio.NewScanner(errReader)
	for in.Scan() {
		cmdRe:=ConvertByte2String(in.Bytes(),"GB18030")
		fmt.Errorf(cmdRe)
	}
}

//对字符进行转码
func ConvertByte2String(byte []byte, charset Charset) string {
	var str string
	switch charset {
	case GB18030:
		var decodeBytes,_=simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
		str= string(decodeBytes)
	case UTF8:
		fallthrough
	default:
		str = string(byte)
	}
	return str
}

编译后的执行结果如下:

我的文件名称为cmdgo,故编译后为cmdgo.exe ,在linux下也可以哦。

有问题可以在评论区留言,技术问题可以私聊我哦。

发布了106 篇原创文章 · 获赞 101 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/qq_24434671/article/details/105227919