今天接触了新的模块io/exec
下面实现了用exec库查看本地ip
package main
import (
"fmt"
"io/ioutil"
"os/exec"
)
func GetCmdRes(cmdstr string)string{
//形成一个被可执行的命令
// func Command
// func Command(name string, arg ...string) *Cmd
// 函数返回一个*Cmd,用于使用给出的参数执行name指定的程序。
//返回值只设定了Path和Args两个参数。
// 如果name不含路径分隔符,将使用LookPath获取完整路径;
//否则直接使用name。参数arg不应包含命令名
cmd := exec.Command(cmdstr)
//形成一个写入的pipe
stdpipe, err := cmd.StdoutPipe()
//func (*Cmd) StdoutPipe
//func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
// StdoutPipe方法返回一个在命令Start后与命令标准输出关联的管道。
// Wait方法获知命令结束后会关闭这个管道,一般不需要显式的关闭该管道。
// 但是在从管道读取完全部数据之前调用Wait是错误的;
// 同样使用StdoutPipe方法时调用Run函数也是错误的。
// func (*Cmd) StdinPipe
// func (c *Cmd) StdinPipe() (io.WriteCloser, error)
// StdinPipe方法返回一个在命令Start后与命令标准输入关联的管道。
//Wait方法获知命令结束后会关闭这个管道。
// 必要时调用者可以调用Close方法来强行关闭管道,
//例如命令在输入关闭后才会执行返回时需要显式关闭管道。
if err != nil{
return "create pipe error"
}
//执行,Run或者Start(Run执行结束时返回回收资源,想看到执行结果,用start)
if err := cmd.Start();err != nil{
return "cmd start error"
}
// func (*Cmd) Run
// func (c *Cmd) Run() error
// Run执行c包含的命令,并阻塞直到完成。
// 如果命令成功执行,stdin、stdout、stderr的转交没有问题,
//并且返回状态码为0,方法的返回值为nil;
// 如果命令没有执行或者执行失败,会返回*ExitError类型的错误;
//否则返回的error可能是表示I/O问题。
// func (*Cmd) Start
// func (c *Cmd) Start() error
// Start开始执行c包含的命令,但并不会等待该命令完成即返回。
//Wait方法会返回命令的返回状态码并在命令返回后释放相关的资源。
resbyte, err := ioutil.ReadAll(stdpipe)
if err != nil{
return "io writer error"
}
//等待cmd执行完
if err := cmd.Wait();err != nil{
return "cmd wait error"
}
return string(resbyte)
}
func main(){
res := GetCmdRes("ipconfig")
fmt.Println(res)
}
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥爱go♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥