关于 exec.Command 调用 bat 的一些疑问。

开发环境:Windows
GO 版本: 1.5.3 (其实跟 go 版本没啥关系…)

想要实现的功能:
类似 cmd.exe set 功能
例如:

set xxx_path=xxxx
set path=%xxx_path%;%path%

如果以上代码是 session.bat 的话,执行 bat 即可,在当前 cmd 环境下,xxx_path 就有值了。关闭当前 cmdxxx_path 的值自然就没有了。

现在的问题:

使用 exec.Command("cmd.exe", "/c", "session.bat").Output() 后,可以正常调用,但执行后就退出了。(相当于 session 已经关闭了)

暂时能想到的办法:

使用 exec.Command("cmd.exe", "/c", "start " + "session.bat").Output(),但是这样会新打开一个 cmd.exe 不是很友好。

请问各位,有没有什么好的解决办法?

共 2 个回复


CrossRun

用一个 channel 阻塞住,干完活了,你在结束呗

# 0

stevewang

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command("cmd.exe")
    cmd.Stdout = os.Stdout
    input, _ := cmd.StdinPipe()
    cmd.Start()
    fmt.Fprintln(input, "set GOOS=linux")
    fmt.Fprintln(input, "set GOOS")
    fmt.Fprintln(input, "exit")
    cmd.Wait()
}
# 1