很多时候我们需要调用操作系统的命令来执行一些程序,在某些特殊的情况下,我们需要拿到程序的调用结果,比如调用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下也可以哦。
有问题可以在评论区留言,技术问题可以私聊我哦。