golang执行命令实时输出(协程通过channel更新数据到主进程)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
type Charset string<br><br>const (<br>   UTF8    = Charset("UTF-8")<br>   GB18030 = Charset("GB18030")<br>)<br>//对字符进行转码<br>func ConvertByte2String(byte []byte, charset Charset) string {<br>   var str string<br>   switch charset {<br>   case GB18030:<br>      var decodeBytes,_=simplifiedchinese.GB18030.NewDecoder().Bytes(byte)<br>      str= string(decodeBytes)<br>   case UTF8:<br>      fallthrough<br>   default:<br>      str = string(byte)<br>   }<br>   return str<br>}<br>func TestCmdOut(t *testing.T) {
    fmt.Println("start")
    cmdstr := "dir /s C:"
    cmd := exec.Command("cmd","/c",cmdstr)
    fmt.Println("11111111")
    stdout,err := cmd.StdoutPipe()
    if err != nil {
        fmt.Println(err)
        return
    }
    stderr,err := cmd.StderrPipe()
    if err != nil {
        fmt.Println(err)
        return
    }
 
    err = cmd.Start()
 
    if err != nil {
        fmt.Println(err)
    }
 
    stdoutScanner := bufio.NewScanner(stdout)
    stderrScanner := bufio.NewScanner(stderr)
    charset := GB18030
 
    totalOut := ""
    totalErr := ""
    outChan :=  make(chan string, 10000)
    errChan :=  make(chan string, 10000)
    exeEnd := false
    go func(scanner *bufio.Scanner) {
        for scanner.Scan() {
            stdoutstr := ConvertByte2String(scanner.Bytes(), charset)
            outChan <- stdoutstr
        }
        exeEnd = true
    }(stdoutScanner)
 
    go func(scanner *bufio.Scanner) {
        for scanner.Scan() {
            stderrstr := ConvertByte2String(scanner.Bytes(), charset)
            errChan <- stderrstr
        }
    }(stderrScanner)
 
    j := 0
    for {
        for i:=0;i<10000;i++ {
            select {
            case outTemp :=  <- outChan:
                fmt.Println("chan:"+outTemp)
                totalOut += "\n" + outTemp
            default:
                fmt.Println(fmt.Sprintf("j:%d",j))
                fmt.Println("direct end")
                goto outexit
            }
        }
        outexit:
        for i:=0;i<10000;i++ {
            select {
            case errTemp := <- errChan:
                totalErr += "\n" + errTemp
            default:
                fmt.Println("err direct end")
                goto errexit
            }
        }
        errexit:
 
        fmt.Println(fmt.Sprintf("totalOut:%s",totalOut))
        fmt.Println(fmt.Sprintf("totalErr:%s",totalErr))
        time.Sleep(1*time.Second)
        fmt.Println(exeEnd)
        if exeEnd {
            j += 1
        }
        if j>=2 {
            break
        }
 
 
    }
 
    err = cmd.Wait()
 
 
}

  

posted @   zipon  阅读(693)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示