github.com/yang-ricky/air@v1.30.0/runner/util_windows.go (about) 1 package runner 2 3 import ( 4 "io" 5 "os" 6 "os/exec" 7 "strconv" 8 "strings" 9 ) 10 11 func (e *Engine) killCmd(cmd *exec.Cmd) (pid int, err error) { 12 pid = cmd.Process.Pid 13 // https://stackoverflow.com/a/44551450 14 kill := exec.Command("TASKKILL", "/T", "/F", "/PID", strconv.Itoa(pid)) 15 return pid, kill.Run() 16 } 17 18 func (e *Engine) startCmd(cmd string) (*exec.Cmd, io.WriteCloser, io.ReadCloser, io.ReadCloser, error) { 19 var err error 20 21 if !strings.Contains(cmd, ".exe") { 22 e.runnerLog("CMD will not recognize non .exe file for execution, path: %s", cmd) 23 } 24 25 c := exec.Command("cmd", "/c", cmd) 26 stderr, err := c.StderrPipe() 27 if err != nil { 28 return nil, nil, nil, nil, err 29 } 30 stdout, err := c.StdoutPipe() 31 if err != nil { 32 return nil, nil, nil, nil, err 33 } 34 stdin, err := c.StdinPipe() 35 if err != nil { 36 return nil, nil, nil, nil, err 37 } 38 c.Stdout = os.Stdout 39 c.Stderr = os.Stderr 40 41 err = c.Start() 42 if err != nil { 43 return nil, nil, nil, nil, err 44 } 45 return c, stdin, stdout, stderr, nil 46 }