GO语言调用系统命令

GO语言调用系统命令

指定执行的命令

需要在Go写的服务里面调用命令行或者批处理,并根据返回的结果做处理

引入的外部包为os/exec

func Command(name string, arg ...string) *Cmd
//函数返回一个*Cmd,用于使用给出的参数执行name指定的程序。返回值只设定了Path和Args两个参数
//如果name不含路径分隔符,将使用LookPath获取完整路径;否则直接使用name。参数arg不应包含命令名

命令执行方式

  • 阻塞方式

需要有返回结果

适用于执行普通非阻塞命令且需要标准输出

需要对命令的标准输出逐行进行处理

  • 非阻塞式

不需要有返回结果

官网调用系统命令方式

命令指定后我们需要执行,执行命令有两种方法run()和start()函数

  • run()函数

Run执行c包含的命令,并阻塞直到完成

如果命令成功执行,stdin、stdout、stderr的转交没有问题,并且返回状态码为0,方法的返回值为nil;如果命令没有执行或者执行失败,会返回*ExitError类型的错误;否则返回的error可能是表示I/O问题

func (c *Cmd) Run() error
  • start()函数

Start开始执行c包含的命令,但并不会等待该命令完成即返回。Wait方法会返回命令的返回状态码并在命令返回后释放相关的资源

func (c *Cmd) Start() error
  • CombinedOutput()函数

执行命令并返回标准输出和错误输出合并的切片

func (c *Cmd) CombinedOutput() ([]byte, error)
  • Wait()函数
func (c *Cmd) Wait() error

Wait会阻塞直到该命令执行完成,该命令必须是被Start方法开始执行的。

如果命令成功执行,stdin、stdout、stderr的转交没有问题,并且返回状态码为0,方法的返回值为nil;如果命令没有执行或者执行失败,会返回*ExitError类型的错误;否则返回的error可能是表示I/O问题。Wait方法会在命令返回后释放相关的资源

  • Output()函数
func (c *Cmd) Output() ([]byte, error)

执行命令并返回标准输出的切片

run()和start()函数的区别?

run函数是一种阻塞式,直至命令结束

start函数是非阻塞式,不会等待命令结束,但是需要使用wait方法等待结束

go调用windows系统命令

go调用windows cmd命令

  • 非阻塞式无返回结果
package main

import (
    "fmt",
    "os.exec"
)

func main()  {
    //go操作cmd命令
    //运行命令不会获取返回值
    cmd1 := "find"
    cmd2 := exec.Command("cmd", "/c",  cmd1) // /C参数 执行字符串指定的命令然后终止
    err := cmd2.Run()
    if err != nil {
        fmt.Println("执行语句失败" + err.Error())
    } else {
        fmt.Println("执行语句成功")
    }
}

执行结果:

执行语句失败exit status 2

go调用powershell命令

package main

import (
    "fmt",
    "os.exec"
)

func main()  {
    //go操作powershell命令
    //运行命令不会获取返回值
    cmd1 := "Get-Date"
    cmd2 := exec.Command("powershell", cmd1)
    err := cmd2.Run()
    if err != nil {
        fmt.Println("执行语句失败" + err.Error())
    } else {
        fmt.Println("执行语句成功")
    }
}

指定命令错误返回失败:

执行命令失败:exec: "powerhshell": executable file not found in %PATH%
  • 阻塞式获取命令执行结果

go 调用powershell命令执行结果

package main

import (
    "fmt",
    "os.exec"
)

func main()  {
    //go操作powershell命令
    //运行命令获取返回值
    cmd1 := "Get-Date"
    cmd2 := exec.Command("powershell", cmd1)
    output, err := cmd2.CombinedOutput()
    if err != nil {
        fmt.Println("执行命令失败:" + err.Error())
    } else {
        fmt.Println(string(output))
    }
}
执行结果:
2021��12��14�� 23:53:29

备注:输出中文出现乱码情况,后面解决后补充结果

go调用脚本

  • 调用powershell脚本

在当前目录下创建test.ps1,powershell脚本test.ps1内容

Get-Date

调用脚本test.ps1

package main

import (
    "fmt",
    "os.exec"
)

func main()  {
    //go操作powershell命令
    //运行命令获取返回值
    cmd1 := "./test.ps1"
    cmd2 := exec.Command("powershell", cmd1)
    output, err := cmd2.CombinedOutput()
    if err != nil {
        fmt.Println("执行命令失败:" + err.Error())
    } else {
        fmt.Println(string(output))
    }
}

执行结果:

E:\work\test\src\test>go run main.go

2021��12��15�� 0:26:21
  • go调用shell脚本
THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录