参考代码
package main
import (
"bufio"
"fmt"
"io"
"os/exec"
"syscall"
"time"
"golang.org/x/text/encoding/simplifiedchinese"
)
type charset string
const (
UTF8 = charset("UTF-8")
GB18030 = charset("GB18030")
)
// 对字符进行转码
func ByteToString(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
}
// 封装一个函数来执行命令
func ExecCommand(commandName string, params []string, f func(str string)) {
// 执行命令
cmd := exec.Command(commandName, params...)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
// 输出
stderr, _ := cmd.StderrPipe()
stdout, _ := cmd.StdoutPipe()
// 输出重定向
if f != nil {
StdOut(f, stderr, stdout)
}
// 执行cmd(非阻塞)
cmd.Start()
}
// 标准输出
func StdOut(f func(str string), out ...io.Reader) {
for _, r := range out {
go func(reader io.Reader) {
in := bufio.NewScanner(reader)
for in.Scan() {
rst := fmt.Sprintf("%s", ByteToString(in.Bytes(), "GB18030"))
f(rst)
}
}(r)
}
}
// 测试
func main() {
ExecCommand("ping", []string{"127.0.0.1", "-t"}, func(str string) {
fmt.Println(str)
})
time.Sleep(15 * time.Second)
}
运行效果如图所示