// +build windows package utils import ( "syscall" "os/exec" "strconv" "golang.org/x/net/context" "errors" ) type Result struct { output string err error } // 执行shell命令,可设置执行超时时间 func ExecShell(ctx context.Context, command string) (string, error) { cmd := exec.Command("cmd", "/C", command) // 隐藏cmd窗口 cmd.SysProcAttr = &syscall.SysProcAttr{ HideWindow: true, } var resultChan chan Result = make(chan Result) go func() { output ,err := cmd.CombinedOutput() resultChan <- Result{string(output), err} }() select { case <- ctx.Done(): exec.Command("taskkill", "/F", "/T", "/PID", strconv.Itoa(cmd.Process.Pid)).Run() cmd.Process.Kill() return "", errors.New("timeout killed") case result := <- resultChan: return ConvertEncoding(result.output), result.err } return "", nil } func ConvertEncoding(outputGBK string) (string) { // windows平台编码为gbk,需转换为utf8才能入库 outputUTF8, ok := GBK2UTF8(outputGBK) if ok { return outputUTF8 } return "命令输出转换编码失败(gbk to utf8)" }