go语言 os/exec. cmd

今天接触了新的模块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♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥

猜你喜欢

转载自blog.csdn.net/qq_44477844/article/details/106593603
cmd